颤音频率

问题描述 投票:1回答:2

我曾经看到过类似的问题,但我似乎无法理解这个问题。如果我在概念上或代码上有什么误解,希望你能帮忙。基本上,我正在做一个从1khz到10khz的持续时间为1s的48khz fs的鸣叫。我只是想用正确的振幅绘制这个啁啾的频率spetrumfft。该代码是。

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

我知道ft函数不归一化,但我从类似的问题中得到的信息有点矛盾,这些问题都说要用sqrt(N)归一化,N和其他东西。

如果我归一化正确的话,我希望在图中看到的是振幅为1,因为那是啁啾的振幅。这是一个错误的假设吗?或者我只是在归一化中做错了什么?

python signal-processing fft dft
2个回答
3
投票

在时域中,对于频率缓慢变化的扫频,整数周期(或足够大的周期数)的平方样本之和可以用以下方法来近似: 1.

     0.5*N*At*At

哪儿 N 是样本数量,而 At 是扫频的振幅.对于您给定的参数(N=48000, At=1),这将是24000,这非常接近于23999.9986331提供的精确值。@tom10的回答.

另一方面,在频域(看频谱图),完整的频谱可以用2个盒子来近似(正如线性频率扫描所预期的那样)。

  • 一个是从1000到10000,你可以在图上显示出来
  • 和另一个从38000到47000的样本,这是由真实信号频谱的赫米特对称性引起的。

在这种情况下,平方(频域)样本的总和可以用以下方法近似地表示出来

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

现在 傅立叶变换的帕塞瓦尔定理 表示,。

\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...,这与你画的图是一致的。


2
投票

你所期望的一对之间保守的是总功率,它是。 所以,如果,经过归一化处理后 sqrt(N),你做。

print sum(abs(yf*yf)), sum(np.array(sine_list_x)**2)

你得到

23999.9986331 23999.9986331

这是在是应该的。

因为你看的不是纯正弦波,所以很难比较振幅,但功率应该总是可以的。

© www.soinside.com 2019 - 2024. All rights reserved.