Answers:
看来您正在通过平均10个窗口(不重叠?)来获得频谱,以得到8192或8193频率(从0到Nyquist,但某些算法可能会降低bin 8192处的Nyquist频率)的幅度平方。
首先要检查的是峰在正确的仓中。您没有说采样率是多少,但是bin 743是采样率的743/16384倍。如果信号确实为800 Hz,则Fs约为17640个样本/秒。好像错了 您的测试信号可能采用标准速率,例如8000、16000、22050、32000、44100或48000。对于Fs = 22050,峰值将在bin 800/22050 * 16384 = 594中急剧变化。
另一个要检查的标准是,信号的总能量在时域和频域都大致相同。这是Python中的示例:
In [1]: NFFT = 2048; N = 10*NFFT; n = arange(N); Fs = 22050
In [2]: x = 0.4*cos(2*pi*400/Fs*n) + 0.6*cos(2*pi*800/Fs*n)
In [3]: y,freqs = psd(x, NFFT=NFFT, Fs=Fs, pad_to=16384) # PSD by Welch's Method
In [4]: sum(x**2)/Fs # time-domain energy
Out[4]: 0.24149869319296949
In [5]: sum(y) * N/16384 # frequency-domain energy
Out[5]: 0.24148752834391252
输入信号x由两个以Fs = 22050个样本/秒采样的正弦曲线组成,被分割为10个非重叠窗口,大小为NFFT = 2048个样本。调用psd(功率谱密度)可将频谱y计算为十个16384点DFT(实际上是8193点,因为x为实值)的幅度平方的平均值。
计算的频域能量具有N / 16384的缩放因子,因为psd函数将y缩放为DFT大小而不是总信号长度。这是否是一个问题取决于系统如何处理PSD规范化。另一个可选的归一化是按1 / Fs缩放。这使能量与原始模拟信号匹配。默认规范化应该在库中有据可查。
您需要绘制FFT输出的幅度。我不熟悉您的编程语言,但是在Python中,您将使用plot(abs(fft(a)))
。对于静音输入,输出应全为零。对于正弦波输入,您应该看到两个尖峰:
对于真实信号,尖峰将从左到右对称。但是,如果您正在执行真实的FFT(这在计算上更加有效),则只会得到图的左半部分作为输出,因为它会忽略冗余镜像。
如果频率较高,则尖峰将更靠近中心。如果频率与块大小完全同步,则尖峰将只有一个点宽,而其他所有峰都将恰好为0。否则,它将像上面一样具有逐渐变细的“裙边”。
我已经使用Excel Analysis Toolpak中的傅立叶分析工具对数据和结果进行了快速检查。