变频恒幅正弦波的FFT没有出现平台,为什么?

问题描述

我想用 python 看看扬声器的音频响应是什么。这可以通过将用麦克风测量的扬声器的输出与给定的输入进行比较来完成。这意味着对于将在时域中的这两个信号,我需要执行 FFT。最终我想播放接近哈曼曲线的目标曲线。我试图生成信号以将其放入 wav 文件中,当检查信号是否符合我对 FFT 的要求时,我得到了一些奇怪的行为。然后我尝试对具有恒定幅度的正弦波执行 FFT,该正弦波在 5 秒内从 21-19700 Hz 以 44100 Hz 的采样率运行。我想使用 welch 方法,我将窗口作为样本的全长,因为在这种情况下,我生成的信号没有任何噪声。这让我得到以下结果:

Fourier transform of sine with constant amplitude and frequency ranging from 21-19700 Hz

import numpy as np
import matplotlib.pyplot as plt
from scipy.signal import welch

samplerate = 44100
duration = 5
time = np.linspace(0,duration,samplerate*duration,endpoint= False)
frequency = np.linspace(21,19700,len(time),endpoint= False)
Const_wave = np.sin(np.pi*2*frequency*time)
f,check = welch(Const_wave,samplerate,nperseg=len(Wave))
plt.plot(f,check)
plt.xscale('log')
plt.xlabel('Frequency [Hz]')
plt.yscale('log')
plt.ylabel('Power')
plt.grid()
plt.show()

之后我尝试了 scipy.fft 模块,它产生了不同但也不是预期的结果:

The same signal but now with the scipy rfft applied

为此,我使用了 scipy.fft.rfft,如下所示:

f = rfftfreq(samplerate*duration,1/samplerate)
check = rfft(Const_wave)
plt.plot(f,check) 
plt.xscale('log')
plt.xlabel('Frequency [Hz]')
plt.yscale('log')
plt.ylabel('Power')
plt.grid()
plt.show()

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)