我們指定信號的采樣率為1kHz,采樣時間為1.5s
import numpy as np
from scipy.fftpack import fft,ifft
Fs = 1000 #采樣頻率
T = 1/Fs #采樣周期,只相鄰兩數(shù)據(jù)點的時間間隔
L = 1500 #信號長度
t = list(range(1500)*T)
構(gòu)造一個信號,其中包含幅值為 0.7 的 50 Hz 正弦量和幅值為 1 的 120 Hz 正弦量。
S = 0.7*np.sin(2*np.pi*50*t) + np.sin(2*np.pi*120*t)
添加符合標準正太分布的噪聲信號:
X = S + np.random.rand(L)
在時域中繪制含噪聲的信號:
plt.plot(t[:50], X[:50])
plt.xlabel("Time(s)")
plt.ylabel("Amplitude")
plt.title("Signol with random noise")
plt.show()

時域信號
計算信號的傅里葉變換
Y = fft(X)
p2 = np.abs(Y) # 雙側(cè)頻譜
p1 = p2[:int(L/2)]
定義頻域 f 并繪制單側(cè)幅值頻譜 P1。與預(yù)期相符,由于增加了噪聲,幅值并不精確等于 0.7 和 1。
f = np.arange(int(L/2))*Fs/L;
plt.plot(f,2*p1/L)
plt.title('Single-Sided Amplitude Spectrum of X(t)')
plt.xlabel('f (Hz)')
plt.ylabel('|P1(f)|')
plt.show()

幅頻圖
完整代碼
import numpy as np
from scipy.fftpack import fft,ifft
from matplotlib.pylab import plt
Fs = 1000 #采樣頻率
T = 1/Fs #采樣周期,只相鄰兩數(shù)據(jù)點的時間間隔
L = 1500 #信號長度
t = np.arange(L)*T
S = 0.7*np.sin(2*np.pi*50*t) + np.sin(2*np.pi*120*t)
X = S + np.random.rand(L)
plt.plot(t[:50], X[:50])
plt.xlabel("Time(s)")
plt.ylabel("Amplitude")
plt.title("Signol with random noise")
plt.show()
Y = fft(X)
p2 = np.abs(Y) # 雙側(cè)頻譜
p1 = p2[:int(L/2)]
f = np.arange(int(L/2))*Fs/L;
plt.plot(f,2*p1/L)
plt.title('Single-Sided Amplitude Spectrum of X(t)')
plt.xlabel('f (Hz)')
plt.ylabel('|P1(f)|')
plt.show()
參考:
快速傅里葉變換