python - python中线性调频的fft振幅

标签 python signal-processing fft dft

我看到有人问过类似的问题,但我似乎无法正确回答。如果我在概念上或代码上误解了某些东西,希望你的猜测能有所帮助。 基本上我正在用 48khz fs 发出从 1khz 到 10khz 持续时间 1s 的线性调频。 我只是想用正确的振幅绘制这个线性调频信号的频谱/fft。代码是:

from scipy.fftpack import fft

N = 48000
fs = 48000.0
sine_list_x = []
K = (10000.0 - 1000.0)/(48000.0)
for x in range(N):
    sine_list_x.append(sin(2*pi*(1000.0*(x/48000.0)+(K/2.0)*(x**2)/(48000.0))))

xf = np.linspace(0.0, fs/2.0, N/2)
yf = fft(sine_list_x)
yf = yf / sqrt(N)
#yf = yf / N

fig3 = pl.figure()
ax3 = fig3.add_subplot(111)
ax3.plot(xf, abs(yf[0:N/2]))

我在此处显示的上述代码的情节 enter image description here

我知道 fft 函数没有归一化,但我从类似的问题中得到了一些相互矛盾的信息,这些问题说通过 sqrt(N)、N 和其他东西进行归一化..

如果我已正确归一化,我希望在图中看到的是振幅为 1,因为这是线性调频脉冲的振幅。这是一个错误的假设吗?或者我只是在规范化中做错了什么?

最佳答案

在时域中,对于频率缓慢变化的扫描,整数个周期(或足够多的周期)的平方样本之和可以近似为

     0.5*N*At*At

其中 N 是样本数,At 是扫描幅度。 对于给定的参数(N=48000At=1),这将是 24000,非常接近 @tom10's answer 中提供的 ~23999.9986331 的精确值。 .

另一方面,在频域中(查看频谱图),完整的频谱可以近似为 2 个框(正如线性频率扫描所预期的那样):

  • 您在图表上显示的 1000 到 10000 中的一个
  • 和另一个从 38000 到 47000 的信号,它产生于实信号频谱的厄尔米特对称性。

在这种情况下,平方(频域)样本的总和可以近似为

     ((10000-1000)+(47000-38000))*Af*Af == 18000*Af*Af 

现在Parseval's theorem for the disrete Fourier transform指出:

\sum_{n=0}^{N-1} \left|x[n]\right|^2 = \frac{1}{N} \sum_{n=0}^{N-1} \left|X[k]\right|^2

在考虑了 1/sqrt(N) 归一化并代入上面找到的近似值后得到:

     24000 = 18000*Af*Af

因此 Af 应该大约等于 sqrt(24000/18000) = 1.1547...,这与您绘制的图形一致。

关于python - python中线性调频的fft振幅,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29387815/

相关文章:

python - 将 pandas 系列的 collections.counter 对象转换为 pandas dataframe 的多列

python - 对 pandas 数据透视中时间序列中某一天的所有值求和

c++ - 直接数字合成 - 什么是相位截断?

audio - Portaudio:将声音示例导入我的缓冲区

logging - 如何从信号的 FFT 中获取 MFCC?

python - 某些 WTForm 验证方法上消息不闪烁

python - 来自 asyncio.gather 的任务不能同时工作

python - Python FFT 中的 DC 项 - 常数项的幅度

signal-processing - 完美正弦波密度谱中的未知噪声

Matlab 绘图对数线性调频幅度