我正在尝试使用C++进行实时音高检测.我正在测试一些来自Performous(http://performous.org/)的代码,因为其他一切对我来说都不起作用.我确信这有效,但我不能让它发挥作用.我已经尝试了几个星期了,而且我还没有能够得到任何音调检测代码.
我试图用伪谱方案数值求解Swift-Hohenberg方程http://en.wikipedia.org/wiki/Swift%E2%80%93Hohenberg_equation,其中线性项在傅立叶空间中隐式处理,而在现实空间中评估非线性.简单的Euler方案用于时间积分.
我的问题是我提出的Matlab代码完美无缺,而依赖FFTW进行傅里叶变换的C++代码变得不稳定,经过几千个步骤后就会发散.我已经跟踪了非线性项的处理方式(参见C++代码中的注释).如果我只使用Phi的真实部分,就会发生不稳定.然而,由于数值舍入误差,Phi应该只有一个可忽略的虚部,并且Matlab正在做类似的事情,保持Phi纯粹真实.在Octave下,Matlab代码也运行良好.初始条件可能类似于
R=0.02*(rand(256,256)-0.5);
Matlab(小振幅波动).
为什么这些代码片段做了不同的事情?具体来说,我如何使C++代码的工作方式与Matlab版本相同?
为了完整起见,我使用FFTW提供的R2C/C2R功能添加了代码.有关详细信息,请参阅http://fftw.org/fftw3_doc/Multi_002dDimensional-DFTs-of-Real-Data.html(我希望我的数据布局正确).此代码始终显示约3100个时间步后的不稳定性.如果我将dt减少到例如0.01,则会发生10次.
#include <iostream>
#include <fstream>
#include <cmath>
#include <fftw3.h>
int main() {
const int N=256, nSteps=10000;
const double k=2.0*M_PI/N, dt=0.1, eps=0.25;
double *Buf=(double*)fftw_malloc(N*N*sizeof(double));
double *D0=(double*)fftw_malloc(N*N*sizeof(double));
// complex arrays
fftw_complex *Phi=(fftw_complex*)fftw_malloc(N*N*sizeof(fftw_complex));
fftw_complex *PhiF=(fftw_complex*)fftw_malloc(N*N*sizeof(fftw_complex));
fftw_complex *NPhiF=(fftw_complex*)fftw_malloc(N*N*sizeof(fftw_complex));
// plans for Fourier transforms
fftw_plan phiPlan=fftw_plan_dft_2d(N, N, Phi, PhiF, FFTW_FORWARD, FFTW_ESTIMATE);
fftw_plan nPhiPlan=fftw_plan_dft_2d(N, N, NPhiF, NPhiF, FFTW_FORWARD, FFTW_ESTIMATE);
fftw_plan phiInvPlan=fftw_plan_dft_2d(N, N, Phi, Phi, FFTW_BACKWARD, FFTW_ESTIMATE);
std::ifstream fin("R.dat", std::ios::in | std::ios::binary); // read initial …Run Code Online (Sandbox Code Playgroud) 我有一个填充浮点数的示例文件,如下所示:
-0.02 3.04 3.04 3.02 3.02 3.06 3.04 3.02 3.04 3.02 3.04 3.02
3.04 3.02 3.04 3.04 3.04 3.02 3.04 3.02 3.04 3.02 3.04 3.02
3.06 3.02 3.04 3.02 3.04 3.02 3.02 3.06 3.04 3.02 3.04 3.02
3.04 3.02 3.04 3.04 3.04 3.02 3.04 3.02 3.02 3.06 3.04 3.02
3.06 3.02 3.04 -0.02 -0.02 -0.02 -0.02 -0.02 -0.02 -0.04 -0.02 -0.04
Run Code Online (Sandbox Code Playgroud)
这些数字放在文本文件中.我正在尝试读取文本文件并确定此信号的频率.该数据从数字示波器捕获.我可以在范围显示中看到频率,但我也想通过在Python中处理它来验证它.我在PC端使用Python从设备捕获数据.
即使我可以在Python中做一些低级的东西,我也是文本处理的新手.我想我需要先将文件中的数据加载到数组中,然后执行FFT或更简单的算法,该算法将产生以Hz为单位的整数.
从理论上讲,我知道如何进行傅里叶分析,我可以用任何特定信号在纸上进行分析.我不知道从哪里开始在给定数据集的Python.我已经尝试过scipy-numpy的文档,但对我来说效果不好.
我希望有经验的用户提供指导.
这是我第一次使用fft函数,并且我试图绘制简单余弦函数的频谱:
f = cos(2*pi*300*t)
采样率是220500.我正在绘制函数f的一秒.
这是我的尝试:
time = 1;
freq = 220500;
t = 0 : 1/freq : 1 - 1/freq;
N = length(t);
df = freq/(N*time);
F = fftshift(fft(cos(2*pi*300*t))/N);
faxis = -N/2 / time : df : (N/2-1) / time;
plot(faxis, real(F));
grid on;
xlim([-500, 500]);
Run Code Online (Sandbox Code Playgroud)
当我将频率提高到900Hz时,为什么会得到奇怪的结果?可以通过将x轴限制从例如500Hz增加到1000Hz来修复这些奇怪的结果.另外,这是正确的方法吗?我注意到很多其他人没有使用fftshift(X)(但我认为他们只进行了单侧频谱分析).
谢谢.
我正在尝试使用1D FFT实现2D FFT.我有一个大小为4x4的矩阵(行专业)
我的算法是:
它是否正确?
我想使用用于FFT(FastFourierTransformer类)的Apache数学公共实现来处理一些虚拟数据,其中8个数据样本对一个完整的正弦波有贡献.最大振幅230.我尝试过的代码片段如下:
private double[] transform()
{
double [] input = new double[8];
input[0] = 0.0;
input[1] = 162.6345596729059;
input[2] = 230.0;
input[3] = 162.63455967290594;
input[4] = 2.8166876380389125E-14;
input[5] = -162.6345596729059;
input[6] = -230.0;
input[7] = -162.63455967290597;
double[] tempConversion = new double[input.length];
FastFourierTransformer transformer = new FastFourierTransformer();
try {
Complex[] complx = transformer.transform(input);
for (int i = 0; i < complx.length; i++) {
double rr = (complx[i].getReal());
double ri = (complx[i].getImaginary());
tempConversion[i] = Math.sqrt((rr * rr) + (ri * ri)); …Run Code Online (Sandbox Code Playgroud) Thrust是开始编程CUDA的惊人包装器.我想知道有什么东西要用NVIDIA CUFFT封装,或者我们需要自己实现?
我正在寻找一个Python包来执行有效的恒定Q变换(即使用FFT来加速该过程).我找到了一个名为CQ-NSGT/sliCQ Toolbox的工具箱,但是我收到以下错误:
File "build\bdist.win32\egg\nsgt\__init__.py", line 37, in <module>
File "build\bdist.win32\egg\nsgt\audio.py", line 7, in <module>
File "C:\Python27\lib\site-packages\scikits\audiolab\__init__.py", line 25, in <module>
from pysndfile import formatinfo, sndfile
File "C:\Python27\lib\site-packages\scikits\audiolab\pysndfile\__init__.py", line 1, in <module>
from _sndfile import Sndfile, Format, available_file_formats, \
File "numpy.pxd", line 30, in scikits.audiolab.pysndfile._sndfile (scikits\audiolab\pysndfile\_sndfile.c:9632)
ValueError: numpy.dtype does not appear to be the correct type object
Run Code Online (Sandbox Code Playgroud)
Numpy(我怀疑)或scikit audiolab更可能出现问题.你知道问题的来源吗?
FFT以将基于时域的特征转换为基于频域的特征(我认为可能更强大),然后进行一些分类或聚类算法.
但我不确定使用什么描述符作为基于频域的特征,因为有信号的振幅频谱,功率谱和相位谱,我已经阅读了一些参考文献,但仍然对其重要性感到困惑.当在基于频域的特征向量(欧几里得距离?余弦距离?高斯函数?Chi-kernel或其他?)上执行学习算法时,应使用什么距离(相似度)函数作为度量?
希望有人给我一些线索或一些我可以参考的材料,谢谢〜编辑
感谢@DrKoch,我选择了一个具有最大L-1规范的空间元素,并log power spectrum在python中绘制它,它确实显示了一些突出的峰值,下面是我的代码和图
import numpy as np
import matplotlib.pyplot as plt
sp = np.fft.fft(signal)
freq = np.fft.fftfreq(signal.shape[-1], d = 1.) # time sloth of histogram is 1 hour
plt.plot(freq, np.log10(np.abs(sp) ** 2))
plt.show()
Run Code Online (Sandbox Code Playgroud)

我有几个微不足道的问题需要确保我完全理解你的建议:
在你的第二个建议中,你说"忽略所有这些价值观".
你的意思是水平线代表阈值,它下面的所有值应该分配给零值吗?"你可以搜索两个,三个最大的山峰,并使用它们的位置和可能的宽度作为'特征'进行进一步分类."
我对"位置"和"宽度"的含义有点困惑,"位置"是指功率谱的对数值(y轴),"宽度"是指频率(x轴)?如果是这样,如何将它们组合在一起作为特征向量并比较"相似频率和类似宽度"的两个特征向量?编辑
我换成np.fft.fft与np.fft.rfft计算正的部分和情节两个功率谱和日志功率谱.
f, axarr = plt.subplot(2, sharex = True)
axarr[0].plot(freq, np.abs(sp) ** 2)
axarr[1].plot(freq, np.log10(np.abs(sp) ** 2))
plt.show()
Run Code Online (Sandbox Code Playgroud)
数字:
如果我错了,请纠正我:
power … fft machine-learning similarity data-mining feature-extraction
我知道我可以通过改变变量的整数改变频率偏移,但我怎样才能改变频率使用数字与小数像0.754或1.2345或67.456.如果我将变量'shift'更改为像5.1 这样的非整数,我得到一个错误,下标索引必须是小于2 ^ 31的正整数或来自行mag2s的逻辑= [mag2(shift + 1:end),0 (1,移位)];
示例下面的问题代码在matlab/octave中使用fft和ifft增加/减少信号的频率 与改变变量一起工作(但它只适用于整数,我需要它也可以使用小数数字).
PS:我正在使用octave 3.8.1,就像matlab一样,我知道我可以通过调整变量ya中的公式来改变频率,但是ya将是从音频源(人类语音)中获取的信号,所以它不会是一个等式.该等式仅用于保持示例简单.是的Fs很大,因为使用的信号文件长约45秒,这就是为什么我不能使用重新采样,因为我在使用时出现内存不足错误.
这是一个动画的youtube视频示例,当我使用测试方程ya = .5*sin(2*pi*1*t)+.2*cos(2*pi*3*t)时,我想要得到的内容我想要让发生,如果我改变的变量转变,从(0:0.1:5)youtu.be/pf25Gw6iS1U请记住,雅将导入音频信号,所以我不会有一个公式可以轻松地调整
clear all,clf
Fs = 2000000;% Sampling frequency
t=linspace(0,1,Fs);
%1a create signal
ya = .5*sin(2*pi*2*t);
%2a create frequency domain
ya_fft = fft(ya);
mag = abs(ya_fft);
phase = unwrap(angle(ya_fft));
ya_newifft=ifft(mag.*exp(i*phase));
% ----- changes start here ----- %
shift …Run Code Online (Sandbox Code Playgroud)