频谱分析是信号处理领域的核心技术,能够将时域信号转换为频域,直观展现信号的频率组成、幅值分布等关键特征。MATLAB凭借强大的信号处理工具箱(Signal Processing Toolbox),成为频谱分析的主流工具。
一、频谱分析基础概念(新手必看)
在开始MATLAB实操前,需先理清两个核心概念:
- 时域与频域:时域描述信号随时间的变化(如电压随时间波动),频域描述信号由哪些频率的正弦波组成;
- 傅里叶变换(FFT):频谱分析的核心数学工具,MATLAB中通过
fft函数实现快速傅里叶变换,是离散信号频谱分析的基础。
核心公式(理解即可)
离散傅里叶变换(DFT)的核心公式:
X ( k ) = ∑ n = 0 N − 1 x ( n ) e − j 2 π ( k − 1 ) n / N , k = 1 , 2 , . . . , N X(k) = \sum_{n=0}^{N-1} x(n)e^{-j2\pi(k-1)n/N}, \quad k=1,2,...,NX(k)=n=0∑N−1x(n)e−j2π(k−1)n/N,k=1,2,...,N
其中:
- x ( n ) x(n)x(n):时域离散信号;
- X ( k ) X(k)X(k):频域信号;
- N NN:信号采样点数。
二、MATLAB频谱分析核心步骤(通用流程)
无论分析何种信号,MATLAB频谱分析的通用流程为:
- 生成/导入时域信号;
- 设置采样参数(采样频率、采样点数);
- 对信号进行FFT变换;
- 修正FFT结果的幅值与频率轴;
- 绘制频谱图;
- 提取关键频率、幅值信息。
三、实操案例:不同类型信号的频谱分析
案例1:单频正弦信号的频谱分析(基础入门)
场景:分析频率50Hz、幅值2的正弦信号,掌握最基础的FFT频谱分析流程。
步骤1:编写MATLAB代码
% ---------------------- 1. 设置采样参数 ----------------------Fs=200;% 采样频率(Hz),需满足奈奎斯特采样定理(Fs > 2*信号最高频率)T=1/Fs;% 采样周期(s)L=1000;% 采样点数t=(0:L-1)*T;% 时间轴(s)% ---------------------- 2. 生成时域信号 ----------------------f0=50;% 信号基频(Hz)A=2;% 信号幅值x=A*sin(2*pi*f0*t);% 生成50Hz正弦信号% ---------------------- 3. FFT变换 ----------------------Y=fft(x);% 对信号进行FFT变换P2=abs(Y/L);% 计算双边频谱的幅值P1=P2(1:L/2+1);% 提取单边频谱(实际应用中常用)P1(2:end-1)=2*P1(2:end-1);% 修正单边频谱的幅值% ---------------------- 4. 构建频率轴 ----------------------f=Fs*(0:(L/2))/L;% 频率轴(Hz),范围0~Fs/2% ---------------------- 5. 绘制频谱图 ----------------------figure('Color','w');subplot(2,1,1);plot(t,x);% 绘制时域波形xlabel('时间 (s)');ylabel('幅值');title('50Hz正弦信号时域波形');xlim([00.1]);% 仅显示前0.1秒,便于观察subplot(2,1,2);plot(f,P1);% 绘制频域频谱xlabel('频率 (Hz)');ylabel('幅值');title('50Hz正弦信号单边频谱');xlim([0100]);% 频率范围0~100Hzgrid on;运行结果说明
- 时域图:显示50Hz正弦波的周期性波动;
- 频域图:在50Hz处出现明显的幅值峰值(幅值≈2),与设定值一致,无多余频率成分。
案例2:多频混合信号的频谱分析(进阶)
场景:分析包含50Hz、120Hz两个频率成分的混合信号,掌握多频信号的频谱提取方法。
% 1. 设置采样参数Fs=500;% 采样频率500HzT=1/Fs;L=1000;t=(0:L-1)*T;% 2. 生成多频混合信号x=1.5*sin(2*pi*50*t)+0.8*sin(2*pi*120*t);% 50Hz(幅值1.5)+120Hz(幅值0.8)% 3. FFT变换与频谱修正Y=fft(x);P2=abs(Y/L);P1=P2(1:L/2+1);P1(2:end-1)=2*P1(2:end-1);f=Fs*(0:(L/2))/L;% 4. 绘图figure('Color','w');subplot(2,1,1);plot(t,x);xlabel('时间 (s)');ylabel('幅值');title('50Hz+120Hz混合信号时域波形');xlim([00.1]);subplot(2,1,2);plot(f,P1);xlabel('频率 (Hz)');ylabel('幅值');title('混合信号单边频谱');xlim([0150]);grid on;% 5. 提取峰值频率与幅值[maxP1,idx]=findpeaks(P1,'MinPeakHeight',0.1);% 提取幅值峰值peakFreq=f(idx);% 峰值对应的频率fprintf('信号峰值频率:');disp(peakFreq);fprintf('对应幅值:');disp(maxP1);关键说明
findpeaks函数:用于提取频谱中的峰值频率,需确保Signal Processing Toolbox已安装;- 运行结果:频谱图中50Hz(幅值≈1.5)、120Hz(幅值≈0.8)处出现两个峰值,与设定值一致。
案例3:含噪声信号的频谱分析(实战)
场景:实际工程中信号常含噪声,需通过加窗、频谱平均等方法提升分析精度。
% 1. 设置采样参数Fs=500;T=1/Fs;L=1000;t=(0:L-1)*T;% 2. 生成含噪声的信号x_clean=1.5*sin(2*pi*50*t)+0.8*sin(2*pi*120*t);x_noisy=x_clean+0.5*randn(size(t));% 加入高斯白噪声% 3. 加窗处理(汉宁窗,减少频谱泄漏)win=hann(L);% 生成汉宁窗x_win=x_noisy.*win;% 信号加窗% 4. FFT变换Y=fft(x_win);P2=abs(Y/L);P1=P2(1:L/2+1);P1(2:end-1)=2*P1(2:end-1);f=Fs*(0:(L/2))/L;% 5. 绘图对比figure('Color','w');% 原始含噪信号时域subplot(3,1,1);plot(t,x_noisy);xlabel('时间 (s)');ylabel('幅值');title('含噪声混合信号时域波形');xlim([00.1]);% 未加窗频谱Y_no_win=fft(x_noisy);P1_no_win=abs(Y_no_win/L);P1_no_win=P1_no_win(1:L/2+1);P1_no_win(2:end-1)=2*P1_no_win(2:end-1);subplot(3,1,2);plot(f,P1_no_win);xlabel('频率 (Hz)');ylabel('幅值');title('未加窗频谱(噪声明显)');xlim([0150]);grid on;% 加窗频谱subplot(3,1,3);plot(f,P1);xlabel('频率 (Hz)');ylabel('幅值');title('加汉宁窗频谱(噪声抑制)');xlim([0150]);grid on;核心技巧
- 频谱泄漏:当信号采样点数不是信号周期的整数倍时,频谱会扩散(泄漏),加窗(汉宁窗、汉明窗、布莱克曼窗)可有效缓解;
- 噪声抑制:加窗后噪声幅值降低,50Hz、120Hz的峰值更突出,是工程中最常用的降噪手段。
四、MATLAB频谱分析常用函数速查
| 函数名 | 功能说明 | 适用场景 |
|---|---|---|
fft | 快速傅里叶变换 | 基础频谱分析 |
fftshift | 将FFT结果的零频分量移到中心 | 双边频谱显示 |
hann/hamming | 生成汉宁/汉明窗 | 抑制频谱泄漏 |
findpeaks | 提取频谱峰值 | 识别信号主频率 |
pwelch | 功率谱密度估计(基于Welch方法) | 非平稳/噪声信号频谱分析 |
spectrogram | 短时傅里叶变换(时频分析) | 频率随时间变化的信号 |
五、常见问题与解决方案
- 频谱幅值与实际不符:未对FFT结果进行幅值修正(单边频谱需乘以2,除采样点数);
- 频率轴设置错误:频率轴范围应为0~Fs/2,计算公式为
f = Fs*(0:(L/2))/L; - 频谱毛刺多:信号含噪声,可加窗、增加采样点数或使用
pwelch函数做功率谱分析; - 提示函数未定义:未安装Signal Processing Toolbox,需在MATLAB中通过
ver命令检查,或安装对应工具箱。
六、工程应用场景
- 振动分析:提取机械设备振动信号的主频,判断是否存在故障(如轴承故障对应特定频率);
- 音频处理:分析语音/音乐信号的频率成分,实现降噪、滤波;
- 电力系统:检测电网谐波(如5次、7次谐波),评估电能质量;
- 生物信号:分析心电(ECG)、脑电(EEG)信号的特征频率。