基于MATLAB的信号频谱分析和参数优化、FFT、窗函数的使用

任务目标

对模拟信号 x ( t ) = 0.1 s i n ( 2 π f 0 t ) + 2 s i n ( 2 π f 1 t ) x(t)=0.1sin(2\pi f_0t)+2sin(2\pi f_1t) x(t)=0.1sin(2πf0t)+2sin(2πf1t)信号进行采样, f 0 = 100 H z f_0=100Hz f0=100Hz f 1 = 110 H z f_1=110Hz f1=110Hz,采样率为 1000 H z 1000Hz 1000Hz。在MATLAB中用FFT进行频谱分析。

任务分析

1、采样率:采样率约为信号频率的10倍,满足采样定理
2、采样长度:采样长度要满足 N > f s / Δ f = 1000 / ( 110 − 100 ) = 100 N>f_s/\Delta f=1000/(110-100)=100 N>fsf=1000/(110100)=100,才能保证FFT频谱精度小于10Hz,进而区分出两个频率。取采样点数 N = 128 N=128 N=128,采样时间 t = N / f s = 128 / 1000 = 128 m s t=N/f_s=128/1000=128ms t=N/fs=128/1000=128ms
关于如何选择采样率、采样点数,来避免栅栏效应、频谱混叠、截断效应等,见下文。
链接: 《数字信号处理》如何合理选择FFT的采样率、采样点数,实现更精确的频谱计算
3、信号幅度问题:由于两个频率接近,且其中一个幅值超过另外一个的10倍,此时极容易发生峰值混叠现象。解决方法是延长采样时间加窗函数

MATLAB程序及结果

1、原始程序
clear; clc; close all;

%% 参数配置
f0 = 100;    % 100 Hz
f1 = 110;    % 110 Hz
fs = 1000;   % 采样率 1000 Hz
N = 128;     % 采样点数(实际信号长度)
N_FFT = 128 ;% FFT点数(通常选择2的幂次,大于或等于信号长度)

% 生成时间向量
t = (0:N-1)/fs;

% 生成信号
x = 0.1 * sin(2 * pi * f0 * t) + 2 * sin(2 * pi * f1 * t);

% 不加窗
x_windowed = x;

% 计算FFT
X = fft(x_windowed, N_FFT);

% 计算频率向量
f = (0:N_FFT-1)*(fs/N_FFT);

% 计算双边频谱的幅度并转换为单边频谱
X_mag = abs(X/N_FFT);
X_mag_single_side = X_mag(1:N_FFT/2+1); % 包含DC分量,且已经是单边频谱的正确幅度

% 绘制频谱图
figure;
stem(f(1:N_FFT/2+1), X_mag_single_side);
title('单边频谱分析');
xlabel('频率 (Hz)');
ylabel('幅度');
grid on;
xlim([0 fs/2]);

在这里插入图片描述

2、参数优化

可以看到100Hz分量被淹没。此时由于频谱分量过于接近,需要提高采样时间来进一步增大FFT频谱分辨率。我们将采样点数N提高至1000,此时采样时间为1秒。FFT点数设置为1024。再次运行。
在这里插入图片描述
观察到频谱中出现周期性的半波,这是 S a Sa Sa函数的副瓣,是因为使用了矩形窗截断导致了频谱泄露,110Hz频率分量泄露后淹没了100Hz的频率分量。

所以我们要对信号进行加窗,使用旁瓣更小的窗函数来突出100Hz分量。

% 选择窗函数(这里以汉宁窗为例)
window = hanning(N);

% 将信号与窗函数相乘
x_windowed = x .* window'; % 注意:window' 是为了确保维度匹配,但在这个例子中不是必需的,因为x和window都是列向量

运行结果如下图所示。
在这里插入图片描述
可以看到,频谱泄露现象大大减轻了。

3、验证

我们测量100Hz和110Hz频率分量的幅值。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
发现幅度比值与原始信号幅度比值差别不大,相对误差为 0.5 / 20 ∗ 100 % = 2.5 % 0.5/20*100\% =2.5\% 0.5/20100%=2.5%

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值