我正在尝试将FFTW3(用C编写的GNU FFT库,http: //www.fftw.org/ )集成到iPhone应用程序中.我下载了源代码,发现有数百个.h和.c文件以及许多其他我无法识别的文件.我不是linux专家,所以我真的不明白.configure文件和其他类似文件是如何工作的.由于没有像filename.xcodeproj这样的文件,我需要自己设置XCode项目.
我想知道的是: 如何在XCode中获取文件并编译它们而不会出错?有经验或提示吗?
我正在搞乱傅立叶变换.现在我已经创建了一个实现DFT实现的类(没有像FFT atm这样做).这是我用过的实现:
public static Complex[] Dft(double[] data)
{
int length = data.Length;
Complex[] result = new Complex[length];
for (int k = 1; k <= length; k++)
{
Complex c = Complex.Zero;
for (int n = 1; n <= length; n++)
{
c += Complex.FromPolarCoordinates(data[n-1], (-2 * Math.PI * n * k) / length);
}
result[k-1] = 1 / Math.Sqrt(length) * c;
}
return result;
}
Run Code Online (Sandbox Code Playgroud)
这些是我得到的结果 Dft({2,3,4})

好吧,看起来还不错,因为那些是我期望的值.我发现只有一件事令人困惑.这一切都与双打的四舍五入有关.
首先,为什么前两个数字不完全相同(0,8660..443 8)vs(0,8660..443).为什么它不能计算零,你期望它.我知道2.8E-15非常接近于零,但事实并非如此.
任何人都知道这些,边缘的错误是如何发生的,如果我能够并且想要对它做些什么.
似乎没有真正的问题,因为它只是小错误.但是,如果您要比较2个值,那么如何处理这些舍入误差.
5,2 + 0i != 5,1961524 …Run Code Online (Sandbox Code Playgroud) 我想从ios上的输入中获取当前的频率,例如A吉他调音应用程序.AurioTouch的例子有点令人困惑,是否有一个很好的例子或可能做到这一点是一个简单的方法?我知道我必须使用FFT,但这就是让我感到困惑的地步.我很高兴任何关于我必须使用哪个框架的提示.我希望有一个人可以帮助我.谢谢.
我有一个振幅频率响应点列表.幅度以分贝给出.
任务是将此AFR列表导出为某些硬件DSP设备的一组系数.我知道这个设备的文件格式.该器件的规格表明它需要12288个系数,DSP有2个FIR滤波器模块(每个6144个抽头).这个想法是在加载那些系数之后,该设备应该作为均衡器工作,它根据初始的放大频率点列表转换信号.
我已经发现FIR滤波器的系数可以通过采用所需频率响应的逆傅里叶变换并且还使用一些窗口函数(优选地不是矩形)来计算.
问题是我不擅长信号处理,我不太了解FIR,我使用FFT来获取音频数据的频率响应,但我仍然对FFT和相关的东西如何工作有一个非常模糊的想法.
点的计算应该用C#或C++完成(我擅长创建C++/CLI包装器),所以我可以将它集成到现有的应用程序中.导出过程不是时间关键,因此我可以使用简单和慢速算法,但无论如何,它不应该在中档计算机上花费超过一分钟.
是否有任何免费的库或代码可以从幅频响应数据中获取FIR系数?
最好的解决方案就像是一个"黑盒子",所以我可以只输入AFR点列表并输出12288个系数,但我还要感谢多个库/代码片段,只要它们可以轻松组合在一起.
附加信息:
将通过该FIR传输的音频的采样频率为44100 Hz
信号的整体特性可以宽松地定义为"音乐",FIR将用于均衡高质量音频,因此如果在高端音频系统上训练有素的耳朵无法听到任何错误和信号失真,那么这些错误和信号失真都是可以接受的.
理论上,初始AFR点中相邻幅度之间的差异可能在[0 dB ... 80 dB]范围内,但在实际测试中它们通常在[0 dB ... 2 dB]范围内
AFR点与它们之间的距离越来越远,第一点是20.17246114 20.68984457和后两点21632.14039 21754.41533
使用以下公式计算得分:
float x;
for(int i = 0; i<bandPoints; i++){
x = (((float)i + 1) / ((float)(bandPoints + 2)));
bandsHz[i] = ((x*x)*(22000-20))+20; // 20...22000
}
Run Code Online (Sandbox Code Playgroud) 我拿一首歌样本并对样本进行FFT(快速傅里叶变换).我能够得到歌曲的频率,但我无法得到这些频率出现的时间.因此,它基本上变得无用,因为我必须将它与不同的样本匹配,除非我得到它的时间信息.
我该怎么办?
java fft javasound frequency-distribution audio-fingerprinting
我有一些具有直流偏移的数据,并且可能会有轻微的斜率。信号是两个主要峰值(类似于高斯),随后是衰减振荡。
我尝试了以下代码,但这并没有消除DC偏移-而是消除了弯曲偏移(窦?)。
function [ filteredData ] = fourierFilter( inputData )
factor = 8;
N = 1024*factor;
dataRaw = zeros([1 N]);
dataStart = N/2 - round(size(inputData,2)/2);
indices = dataStart:(dataStart+size(inputData,2))-1;
dataRaw(indices) = inputData;
% transform to fourierspace
fourierSpectrum = (fftshift(fft(dataRaw)));
% add filter
delta = 1*factor/4;
indicesfftfilter = N/2-delta:N/2+delta;
fourierSpectrum(indicesfftfilter) = 0;
% back transform
filteredData = real(ifft(ifftshift(fourierSpectrum)));
filteredData = (filteredData(indices));
Run Code Online (Sandbox Code Playgroud)
此处的数据示例(蓝色)和过滤后的曲线(红色)具有 delta = 3*factor/4

我运行测试sqript.它使用基于FFTW的numpy.fft.fft(),anfft.fft()和基于FFTW的pyfftw.interfaces.numpy_fft.fft().
这是我的测试脚本的来源:
import numpy as np
import anfft
import pyfftw
import time
a = pyfftw.n_byte_align_empty(128, 16, 'complex128')
a[:] = np.random.randn(128) + 1j*np.random.randn(128)
time0 = time.clock()
res1 = np.fft.fft(a)
time1 = time.clock()
res2 = anfft.fft(a)
time2 = time.clock()
res3 = pyfftw.interfaces.numpy_fft.fft(a,threads=50)
time3 = time.clock()
print 'Time numpy: %s' % (time1 - time0)
print 'Time anfft: %s' % (time2 - time1)
print 'Time pyfftw: %s' % (time3 - time2)
Run Code Online (Sandbox Code Playgroud)
我得到了这些结果:
Time numpy: 0.00154248116307
Time anfft: 0.0139805208195
Time pyfftw: 0.137729374893
Run Code Online (Sandbox Code Playgroud)
anfft库在巨大的数据上产生更快的fft,但是pyfftw呢?为什么这么慢?
据我所知,频谱的IFFT幅度部分是偶对称的,而相位部分是奇对称的应该是真实的.
让我们考虑这个例子:
signal_spectrum = [1 2+i 3+2*i 4+8*i 5 4-8*i 3-2*i 2-i 1];
Run Code Online (Sandbox Code Playgroud)
很明显,这个光谱符合我上面列出的两个条件.当我使用Matlab执行IFFT时,我获得:
signal= ifft(signal_spectrum) =
2.7778
0.8003 - 0.2913i
-1.2861 + 1.0792i
0.5218 - 0.9038i
-0.0812 + 0.4604i
0.0976 + 0.5536i
-0.6329 - 1.0962i
1.3343 + 1.1196i
-2.5316 - 0.9214i
Run Code Online (Sandbox Code Playgroud)
获得的信号是复值的.为什么?有什么问题?
我想知道如果我使用10000个样本并且做fft,我的结果将会有很大的不同,相比之下我的样本恰好等于2的幂,或者它只影响fft的速度?Matlab是否自动进行零填充?或者我应该做零填充?
更多的信息 :
我正在使用matlab版本2012b,fft函数来对我的样本执行dft.我有10分钟的时域数据,采样率为50 KHz.我的工作类型需要我在200毫秒的窗口中分配时域数据.在这些200毫秒的窗口上执行fft后,我对不同的窗口结果进行了平均.在50Hz频率系统中200ms,由50Khz采样意味着每个fft操作大约10000个样本.
亲爱的,阿里
我试图在Matlab中使用1D DFT的组合来实现2D DFT.将我的结果与Matlab的内置函数(fft2)进行比较时,我意识到我有以下问题:
此图显示了两个结果之间的比较.侧面的红色数字表示重新排序问题.

我的代码如下:
x = imread('img.png');
x = double(x);
x = x(1:12,1:5)
% FFT
Xw = complex(zeros(size(x)));
for row = 1:size(x,1)
Xw(row,:) = fft(x(row,:));
end
for col = 1:size(x,2)
Xw(:,col) = fft(Xw(:,col)');
end
Run Code Online (Sandbox Code Playgroud)
有人可以指出我的问题在哪里吗?谢谢