微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决变频恒幅正弦波的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 举报,一经查实,本站将立刻删除。