用matlab编程,实现一个正弦信号,频率为45赫兹,非整周期采样,并进行加窗函数和不加窗函数的傅里叶变换,分别画出结果图
时间: 2024-12-14 10:24:33 浏览: 16
在MATLAB中,你可以通过以下步骤来实现这个过程:
1. **生成正弦信号**:
```matlab
fs = 1000; % 设定采样频率,假设实际系统中高于45Hz,以防混叠
t = 0:1/fs:1; % 创建时间向量,范围从0到1秒,步长等于1/fs
f = 45; % 频率为45Hz
sin_signal = sin(2*pi*f*t); % 生成正弦波信号
```
2. **非整周期采样**:
如果需要非整周期采样,可以调整时间向量`t`,例如,如果你想选择一个特定的采样点数,可以这样做:
```matlab
num_samples = floor(fs * 2); % 指定采样点数
t = linspace(0, 1, num_samples); % 更新时间向量
```
3. **加窗函数**:
对于加窗,比如汉明窗或矩形窗,可以使用MATLAB内置函数:
```matlab
window = hann(num_samples); % 使用Hanning窗(汉明窗)
sin_windowed = sin_signal .* window;
```
然后对加窗后的信号进行傅里叶变换。
4. **不加窗函数的傅里叶变换**:
```matlab
fourier_unwindowed = fft(sin_signal);
```
5. **绘制结果图**:
```
figure;
subplot(2,1,1) % 上半部分第一幅图
plot(t, sin_signal, 'b', 'LineWidth', 2), hold on
title('原始正弦波');
legend('无窗函数');
subplot(2,1,2) % 下半部分第二幅图
plot(t, sin_windowed, 'g', 'LineWidth', 2)
title('加窗函数后的正弦波');
% 计算并显示频谱
freq = (0:num_samples-1)*(fs/num_samples)/length(window);
subplot(2,1,1), plot(freq, abs(fourier_unwindowed), 'r', 'LineWidth', 2)
subplot(2,1,2), plot(freq, abs(fourier_unwindowed ./ length(window)), 'm', 'LineWidth', 2)
hold off
```
每个子图会显示原始正弦波、加窗后波形以及两种情况下的傅立叶变换结果。注意,由于MATLAB中的FFT默认是对整个序列进行,所以在加窗后,我们需要除以窗口长度来得到等效的能量分布。
阅读全文