我问这个问题是因为通常,输入数据(例如音频信号)是连续的数组块,在将它们输入 fft 例程之前,必须使用循环将数据结构从数组转换为 Complex(re, im) 数组
当输入数据没有虚部时,我们可以直接赋值或者使用memcpy,这样会节省很多时间。
我正在尝试在C 上实现FFT 算法。我根据《C 中的数字食谱》一书中的函数“four1”编写了一段代码。我知道使用 FFTW 等外部库会更有效,但我只是想尝试将此作为第一种方法。但我在运行时遇到错误。
\n经过一段时间的尝试调试后,我决定复制书中提供的完全相同的功能,但我仍然遇到同样的问题。问题似乎出在以下命令中:
\ntempr = wr * data[j] - wi * data[j + 1];\ntempi = wr * data[j + 1] + wi * data[j];\nRun Code Online (Sandbox Code Playgroud)\n和
\ndata[j + 1] = data[i + 1] - tempi;\n\nRun Code Online (Sandbox Code Playgroud)\nj 有时与数组的最后一个索引一样高,因此在索引时不能加 1。
\n正如我所说,我没有对代码进行任何更改,所以我很惊讶它对我不起作用;这是一本著名的 C 数值方法参考书,我怀疑其中是否有错误。另外,我发现了一些关于相同代码示例的问题,但它们似乎都没有相同的问题(例如,请参见C: Numerical Recipies (FFT) )。我究竟做错了什么?
\n这是代码:
\n#include <iostream>\n#include <stdio.h>\nusing namespace std;\n\n#define SWAP(a,b) tempr=(a);(a)=(b);(b)=tempr\nvoid four1(double* data, unsigned long nn, int isign)\n{\n unsigned long n, mmax, m, j, istep, …Run Code Online (Sandbox Code Playgroud) 我正在从商业仪器中获取光学OFDR (1,2,3 )数据的FFT 。
然而,我花了几天时间困惑为什么 FFT 没有给出预期的结果。原来这是因为我导入的数组具有 shape(20000,1)而不是(20000,). 前者的 FFT(20000,1)返回不变,而具有形状的对象的 FFT(20000,)会产生正确的结果。从概念上讲,这些对我来说似乎是完全相同的数组 - 但实际上它们显然是不同的 FFT 计算。
谁能解释为什么这个看似虚构的维度破坏了我的 FFT?
# Produces bad FFT:
>> np.shape(MeasData)
: (433229, 1)
# Produces correct FFT
>> np.shape(MeasData[:,0])
: (433229,)
Run Code Online (Sandbox Code Playgroud)
第二,空维度意味着什么?也就是说,为什么形状报告为而(2000,)不是(2000)(没有逗号)?
下面是一个图,显示了其中每一个以及相应的傅立叶变换,通过numpy.rfft( MeasData ) (抱歉我不知道如何生成有用的 MWE 数据):

第一个和第二个 (MeasData = [433000,1]) 显示 FFT 根本没有执行任何操作,而第三个和第四个 (MeasData = [433000,]) 显示正确的 FFT。
[400000,1]形状与 不同有何意义[400000,]?看起来很违反直觉。
>> fft([1 4 66])
ans =
71.0000 -34.0000 +53.6936i -34.0000 -53.6936i
Run Code Online (Sandbox Code Playgroud)
有人能根据上面的结果解释一下吗?
对我来说,这看起来有点奇怪.什么是前几个箱子大量飙升?什么是非线性的交易?
我正在绘制实部和虚部的平方和的平方根.我已经尝试过使用对数,但我得到了很多基线的移动,也就是说,光谱不会在屏幕中保持居中.
如果你能指出我正确的方向,我会很感激!
我使用FFTW生成系数,现在我想重建原始数据,但只使用第一个numCoefs系数而不是全部系数.目前我正在使用下面的代码,这是非常慢的:
for ( unsigned int i = 0; i < length; ++i )
{
double sum = 0;
for ( unsigned int j = 0; j < numCoefs; ++j )
{
sum += ( coefs[j][0] * cos( j * omega * i ) ) + ( coefs[j][1] * sin( j * omega * i ) );
}
data[i] = sum;
}
Run Code Online (Sandbox Code Playgroud)
有更快的方法吗?
我有另一个问题.非常类似于我已经问过的另一个(并得到很大的帮助 - 再次感谢).不幸的是,其他线程的解决方案在这里不起作用:(http://stackoverflow.com/questions/8680909/fft-in-matlab-and-numpy-scipy-give-different-results)
现在是关于ifft:
# i have an array 'aaa' of shape (6,) such as:
for i in aaa: print i
...
(1.22474487139+0j)
(-0.612372435696-1.06066017178j)
(-0.612372435696+1.06066017178j)
(1.22474487139+0j)
(-0.612372435696-1.06066017178j)
(-0.612372435696+1.06066017178j)
#when i perform np.ifft the result is:
np.fft.ifft(aaa)
array([ 1.48029737e-16 +1.48029737e-16j,
-8.26024733e-17 -1.72464044e-16j,
1.22474487e+00 -3.94508649e-16j,
3.70074342e-17 -2.96059473e-16j,
-2.22044605e-16 +2.46478913e-16j, 4.55950391e-17 +4.68523518e-16j])
###################################################################
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% BUT IN MATLAB
% the same array...
aaa =
1.2247
-0.6124 - 1.0607i
-0.6124 + 1.0607i
1.2247
-0.6124 - 1.0607i
-0.6124 + 1.0607i
% ...gives the result:
ifft(aaa) …Run Code Online (Sandbox Code Playgroud) 我对音频处理感兴趣,我想进行FFT计算.许多资源和教程都说vDSP很棒.但是我不明白为什么计算后的实部和虚部的大小是N/2?如何在1024个样本上获得1024个实数和虚数值.例如,这种用于计算的服务正确地执行FFT.
我目前需要在1024个采样点信号上运行FFT.到目前为止,我已经在python中实现了我自己的DFT算法,但它非常慢.如果我使用NUMPY fftpack,甚至转移到C++并使用FFTW,你们认为它会更好吗?
我有fortran代码计算离散信号的FFT(具有两个不同频率的双正弦信号),从以下提取:
y = 0.5*np.sin(2 * np.pi * ff1 * t) + 0.1*np.sin(2 * np.pi * ff2 * t)
当我使用fortran代码计算FFT并且与使用python计算的FFT进行比较时,我可以看到:
1.两个图中的选秀权的差异是由于四舍五入?我可以以某种方式消除或减少它吗?
python中使用的代码是:
import numpy as np
import matplotlib.pyplot as plt
from scipy import fft
Fs = 2048 # sampling rate = number of lines in the input file
Ts = 1.0/Fs # sampling interval
data = np.loadtxt('input.dat')
t = data[:,0]
y = data[:,1]
plt.subplot(2,1,1)
plt.plot(t,y,'ro')
plt.xlabel('time')
plt.ylabel('amplitude')
plt.subplot(2,1,2)
n = len(y) # length of the signal
k = np.arange(n)
T …Run Code Online (Sandbox Code Playgroud)