依据上述4个信号,其中fs=1000, f=5,20,50,100; t=0:1产生如图所示信号,进行FFT变换,和短时FFT变换
时间: 2024-09-11 08:17:06 浏览: 87
GPS_L1-I_CA_SV4_IF=3.996e6_Fs=81.845e6_test.rar_IF gps_gps L1 信号
为了生成一个基于给定频率(f = 5, 20, 50, 100 Hz)和采样率(fs = 1000 Hz)的离散时间信号,我们首先需要创建一个正弦波数组,然后结合它们形成一个复合信号。接下来,我们将对这个信号进行快速傅立叶变换(FFT)以及短时傅立叶变换(STFT)。
**步骤1:生成信号**
```python
import numpy as np
import matplotlib.pyplot as plt
# 定义信号参数
t = np.arange(0, 1, 1/fs) # 时间轴,从0到1秒,步长为1/1000秒
fs = 1000
frequencies = [5, 20, 50, 100] # 频率列表
# 创建复合信号
signal = np.zeros_like(t)
for freq in frequencies:
signal += np.sin(2*np.pi*freq*t)
# 可视化原始信号
plt.plot(t, signal)
plt.xlabel('Time (s)')
plt.ylabel('Amplitude')
plt.title('Original Signal with Different Frequencies')
plt.grid(True)
plt.show()
```
**步骤2:FFT变换**
使用`numpy.fft.fft()`函数进行FFT:
```python
fft_result = np.fft.fft(signal)
fft_freqs = np.fft.fftfreq(len(signal), d=1/fs) # 计算频率轴
# 对结果取实部和幅值
magnitude = np.abs(fft_result)
phase = np.angle(fft_result)
# 选择前半部分频率轴,因为负频部分是对称的
fft_magnitude = magnitude[:len(fft_freqs)//2]
fft_phase = phase[:len(fft_freqs)//2]
# 绘制FFT结果
plt.figure()
plt.plot(fft_freqs, fft_magnitude)
plt.xlabel('Frequency (Hz)')
plt.ylabel('Magnitude')
plt.title('Fast Fourier Transform (FFT)')
plt.grid(True)
plt.show()
```
**步骤3:短时傅立叶变换(STFT)**
短时傅立叶变换通常用于分析信号的时间变化频率特性,我们需要指定窗函数和窗口大小。这里使用Hann窗函数示例:
```python
window_size = int(fs * 0.1) # 选取10%的采样点作为窗口长度
overlap = window_size // 2
stft_matrix = stft(signal, fs, window=np.hanning(window_size), hop_length=overlap)
# 可视化STFT矩阵
plt.pcolormesh(np.arange(0, len(signal)-window_size+1, overlap),
fft_freqs, stft_matrix.T, shading='auto', cmap='viridis')
plt.xlabel('Time (Samples)')
plt.ylabel('Frequency (Hz)')
plt.title('Short-Time Fourier Transform (STFT)')
plt.colorbar(label='Magnitude')
plt.show()
```
通过以上步骤,你就得到了复合信号的FFT结果和STFT图像。这两个变换有助于理解信号的频率成分及其随时间的变化情况。
阅读全文