在音调上使用 numpy fft 输出错误

信息处理 fft Python
2022-02-13 02:49:01

通过以下简单的 Python fft 实现,我得到了错误的输出。有人可以解释我需要解决的问题吗?

import numpy as np
import matplotlib.pyplot as plt


def tone(fs, frequency, dur=1, amp=50):
    '''
    test tone
    '''
    nsamples = dur * fs
    t = np.linspace(0, dur, nsamples, endpoint=False)

    tone = amp*np.sin(frequency*2*np.pi*t)
    return tone

fs = 16000
dur = 0.5
freq = 1500

stim = tone(fs, freq, dur=dur)
time = np.linspace(0, dur, num=fs*dur)

t = np.linspace(0, fs, num=fs*dur)
fdata = np.fft.fft(stim)

hwp = int(np.shape(fdata)[0]/2)
tplt = t[:hwp]
fplt = fdata[:hwp]

plt.figure(num=1)
plt.plot(time, stim, 'b-')
plt.show()

plt.figure(num=2)
plt.plot(tplt, np.abs(fplt.real), 'b-')
plt.xscale('log')
plt.show()

移除

, 端点 = 假

虽然我不明白为什么会修复实现。
也许有人可以解释(?)

2个回答

更新:我怀疑光谱泄漏,但事实并非如此。这样做的原因是 OP 选择仅绘制 FFT 的实部,具有线性幅度比例,因此无法看到频谱泄漏的实际影响。(当我们使用端点 = true 时,我们实际上得到了频谱泄漏!)。如果您将绘图从 fplt.real 更改为 np.abs(fplt),您将看到必须包含实部和虚部的真实幅度图!)。

这是端点 = true 并绘制幅度的 dB 的结果。plt.plot(tplt, 20*np.log10(np.abs(fplt)), 'b-')。这种情况下的频谱泄漏非常明显!

端点 = 真对数日志图

这是端点 = false 使用 plt.plot(tplt, 20*np.log10(np.abs(fplt)), 'b-') 的结果

在这里,我们看到噪声降低了近 300 dB(浮点精度)。

端点=假日志日志图

问题是您只是在绘制变换的真实部分。绘制整个数组的绝对值(复数的大小),您将得到所需的结果。