如果您只需要绘制 FFT 频谱(即绘制幅度与频率),那么只需获取一个具有离散 FFT bin 频率的数组并将其绘制为幅度。频率仅存在于由下式给出的离散位置
f=nfsN−fs2where n =0,1,2,...N
幅度 A 由下式给出
A=Magnitude(Data[n])where n =0,1,2,...N
例如,如果您有一个 8192 长的音频信号,您将执行类似于我在下面编写的小脏伪代码/C# 代码示例中所做的事情。
N = 8192;
Sample_Rate = 44100;
float[] myAudio = new Float[N];
myAudio = getAudio();
Complex[] myFFT_Audio = FFT(myAudio); //Returns N complex values
//Get Array of frequency Values
float[] frequencies = new float[N]
for( i = 0 ; i < N; i++)
{ frequencies[i] = i * (Sample_Rate / N) - (Sample_Rate / 2); }
//Get Amplitudes
float[] Amplitudes = new float[N]
for( i = 0; i < N; i++)
{ Amplitudes[i] = myFFT_Audio[i].Magnitude(); }
//Plot Frequencies vs Amplitudes - will plot for frequencies -fs/2 to fs/2
PLOT(frequencies , Amplitudes);
如果您只想绘制来自0到fs/2而不是从−fs/2到fs/2您可以丢弃前半部分的值,只绘制后半部分。
您还需要确保知道您的 FFT 算法返回的数据 FFT 样本类型,因为算法可以返回与任一频率相对应的 FFT 样本,范围从−fs/2到fs/2或从0到fs. 上面的代码示例假设前者是正确的,但情况并非总是如此。
例如,Matlab 通常会给出与频率范围相对应的 FFT 样本0到fs所以在这种情况下你的频率就是
f=nfsN
你仍然可以从−fs/2到fs/2不过很容易,因为傅里叶变换是周期性的,周期等于fs.