拟合正弦波的频率、相位和振幅

numpy_sin.py

本习题的程序文件

本习题介绍如何从带噪声的正弦波数据中计算出其频率、相位和振幅。

用FFT估算初值

下面我们用程序模拟一个如【图:带噪声的正弦波信号】所示的带噪声的正弦波信号。

FREQ = 0.713
import numpy as np
np.random.seed(0)
t = np.linspace(0, 20, 2000)
x = 0.8*np.sin(2*np.pi*FREQ*t+1.2) + np.random.normal(size=len(t)) * 0.1
import pylab as pl
pl.plot(t, x)
/tech/static/books/scipyex/_images//numpy_sin_01.png

带噪声的正弦波信号

请编写程序用2048点FFT估算此信号的频谱:

【你的程序】用FFT估算x的频率freq_fft
print "real frequency:", FREQ, ", frequency by FFT:", freq_fft

程序的输出为:

real frequency: 0.713 , frequency by FFT: 0.731341463415
如果计算FFT时不指定点数,则采用数据的长度。而如果数据的长度不是2的整数次幂,特别是当长度为素数时,FFT的运算速度将从O(n \log n)退化为n^{2}

用曲线拟合精确计算参数

用FFT估算的频率精度有限,这是因为数据的重复周期数不够。我们可以采用数据拟合找到更精确的正弦波参数。请编写对正弦波进行拟合的程序:

from scipy.optimize import curve_fit
【你的程序】用正弦波函数对x数组进行拟合
print "gain,freq,phase: ", gain,freq,phase

程序的输出为:

gain,freq,phase:  0.8006594791 0.712904030353 1.21543986905

可以看出拟合的结果十分接近原始的正弦波信号。

內容目录

上一个主题

数值微分的精度

下一个主题

将PWM信号还原为原始信号

本页

loading...