这两段代码在频谱分析方法上存在显著差异,导致生成的图形不同,主要原因如下:
1. 方法差异
% 执行FFT
N = length(signal_data); % 数据点数,影响频率分辨率
%(1:1e-3*fs)
Y = fft(signal_data,N);
P2 = abs(Y/N); % 双边频谱
P1 = P2(1:N/2+1); % 单边频谱
P1(2:end-1) = 2*P1(2:end-1); % 将双边频谱的非零频部分乘以2
f = fs*(0:(N/2))/N; % 频率轴
% 人为规定频率轴显示范围(例如0-1000 Hz)
f_min = 0;
f_max = 1.2e6;
idx = (f >= f_min) & (f <= f_max);
% 绘制FFT结果
figure;
%plot(f(idx), 20*log10(P1)) % 显示功率谱密度的对数值(dB)
plot(f(idx), 20*log10(P1(idx)));
xlabel('频率 (Hz)')
ylabel('|P1| (dB)')
title('单边幅度谱 (FFT)')
grid on;
- FFT直接法:
- 原理:直接对信号进行FFT,计算幅度谱。通过调整得到单边频谱,并转换为分贝(dB)。
- 特点:
- 无分段、无平均,单次FFT结果易受噪声影响,波动较大。
- 频率分辨率由信号全长决定(Δf = fs/N),分辨率较高。
- 未明确加窗(默认矩形窗),频谱泄漏可能较严重。
- 单位:幅度谱的对数值(20log₁₀|幅度|),无功率归一化。
% 计算功率谱密度
[f, Pxx] = pwelch(signal_data, hann(optimal_window), round(optimal_window/2), [], fs);
% 转换为dBm/Hz
Pxx_dbm = 10 * log10(Pxx * 1000 / R);
% 绘制频谱图
figure('Position', [100, 100, 1200, 600]);
plot(f/1e6, Pxx_dbm, 'LineWidth', 1);
xlabel('频率 (MHz)');
ylabel('功率谱密度 (dBm/Hz)');
title([title_str, ' (窗口长度: ', num2str(optimal_window), '点)']);
grid on;
- Welch方法(pwelch):
- 原理:将信号分段、加窗(如汉宁窗)、计算每段FFT并平均,估计功率谱密度(PSD)。
- 特点:
- 分段和平均降低噪声方差,结果更平滑。
- 频率分辨率由窗口长度决定(Δf = fs/窗口长度),分辨率可能较低。
- 加窗减少频谱泄漏,但主瓣宽度增加。
- 单位:功率谱密度(10log₁₀(功率/Hz)),转换为dBm/Hz(考虑负载电阻R)。
2. 图形差异原因
纵轴单位与量纲:
- FFT图:显示幅度谱的对数值(dB),反映信号幅度分布。
- Welch图:显示功率谱密度的dBm/Hz,反映功率在频域的分布(需考虑负载电阻R)。
- 数值差异:幅度谱用20log₁₀,功率谱用10log₁₀,相同信号在两者中的dB值不同。
频谱平滑度:
- FFT结果因单次计算包含噪声波动,曲线较“毛刺”。
- Welch方法通过平均抑制噪声,曲线更平滑。
频率分辨率:
- FFT分辨率由信号全长决定,可能更高(如Δf=1Hz)。
- Welch方法分辨率由窗口长度决定,可能较低(如Δf=100Hz)。
频谱泄漏与窗函数:
- FFT未加窗(矩形窗),泄漏明显,可能出现虚假频率成分。
- Welch使用汉宁窗,泄漏减少,但主瓣变宽,峰值可能展宽。
归一化处理:
- FFT仅简单除以N,未补偿窗函数影响。
- Welch内部对窗函数功率归一化,确保PSD估计准确。
3. 应用场景
- FFT直接法:适合分析瞬态信号或需要高频率分辨率的场景。
- Welch方法:适合分析稳态信号,需平衡频率分辨率与估计方差。
总结
两段代码分别从幅度谱和功率谱密度两个角度分析信号,方法论的差异(单次FFT vs 分段平均、幅度 vs 功率、窗函数影响、单位转换)导致图形在平滑度、分辨率、纵轴量纲和数值上显著不同。选择哪种方法需根据具体需求(如关注幅度细节或功率分布)决定。
除了 FFT直接法 和 Welch方法(pwelch),还有多种频谱分析方法,它们在噪声抑制、分辨率、计算复杂度等方面各有优劣。以下是几种常见方法的对比:
1. 周期图法 (Periodogram)
- 原理:直接对信号做FFT并计算幅值平方(功率),等效于矩形窗的Welch方法(不分段、不平均)。
- 特点:
- 优点:简单快速,频率分辨率最高(由信号全长决定)。
- 缺点:方差大(噪声波动剧烈),频谱泄漏严重(未加窗)。
- 图形表现:与FFT直接法类似,但纵轴是功率(而非幅度),曲线毛刺多。
2. 多窗口法(MTM, Multitaper Method)
- 原理:使用多个正交窗函数(如Slepian序列)对信号加窗,分别计算功率谱后平均。
- 特点:
- 优点:通过多窗口减少频谱泄漏,方差低于周期图法。
- 缺点:主瓣宽度增加,频率分辨率降低,计算复杂度高。
- 图形表现:比Welch方法更平滑,但分辨率可能略低。
3. 最大熵谱估计(MEM, Maximum Entropy Method)
- 原理:基于自回归(AR)模型,假设信号由白噪声激励生成,通过模型参数外推频谱。
- 特点:
- 优点:适合短数据,高频分辨率(可突破傅里叶极限)。
- 缺点:模型阶数选择敏感,可能产生虚假峰值。
- 图形表现:在短信号中分辨率高,但可能出现虚假尖峰。
4. 短时傅里叶变换(STFT)
- 原理:将信号分帧加窗,逐帧做FFT,得到时频联合分布(频谱图)。
- 特点:
- 优点:可分析非平稳信号的时变频谱。
- 缺点:时间-频率分辨率受窗口长度制约(Heisenberg不确定性)。
- 图形表现:以热图形式展示频率随时间变化。
5. 小波变换(Wavelet Transform)
- 原理:用可变尺度的基函数(小波)分解信号,适合分析瞬态或非平稳信号。
- 特点:
- 优点:多分辨率分析(低频高频率分辨率,高频高时间分辨率)。
- 缺点:无统一频标(频率轴非线性),计算复杂。
- 图形表现:时频图,频率轴为对数尺度。
对比总结
方法 | 核心思想 | 分辨率 | 方差(噪声) | 泄漏抑制 | 适用场景 |
---|---|---|---|---|---|
FFT直接法 | 单次FFT幅度谱 | 最高 | 高(无平均) | 差(矩形窗) | 瞬态信号、高分辨率需求 |
Welch方法 | 分段加窗+平均 | 中 | 低(平均抑制) | 好(加窗) | 稳态信号、平滑频谱需求 |
周期图法 | 单次FFT功率谱 | 最高 | 高 | 差 | 简单快速分析 |
多窗口法(MTM) | 多正交窗平均 | 中低 | 较低 | 极好 | 低泄漏、低方差需求 |
最大熵(MEM) | 自回归模型外推 | 极高 | 中高(依赖模型) | 依赖模型 | 短数据、高频分辨率需求 |
STFT | 时频联合分析 | 时-频权衡 | 中 | 中 | 非平稳信号 |
小波变换 | 多尺度分解 | 自适应 | 中 | 中 | 瞬态信号、多分辨率分析 |
为什么不同方法画出的图不同?
分辨率与平滑度的权衡:
- FFT直接法分辨率高但噪声大,Welch方法牺牲分辨率换取平滑性。
- MEM可突破分辨率限制,但需要谨慎选择模型阶数。
泄漏抑制:
- 未加窗的FFT泄漏严重(如周期图法),加窗方法(Welch、MTM)泄漏少。
量纲与单位:
- FFT幅度谱单位是dB(20log₁₀|幅度|),功率谱密度单位是dBm/Hz(10log₁₀(功率/Hz))。
时频特性:
- STFT和小波变换展示时变特性,其他方法仅显示全局频谱。
如何选择方法?
- 稳态信号:优先Welch方法(平衡分辨率与方差)。
- 短数据/高频分辨率:尝试最大熵(MEM)。
- 非平稳信号:使用STFT或小波变换。
- 低泄漏需求:多窗口法(MTM)。
- 快速粗略分析:FFT直接法或周期图法。
代码示例(其他方法)
1. 多窗口法(MTM)
% 使用pmtm函数
[f, Pxx] = pmtm(signal_data, 4, [], fs); % 4个Slepian窗
Pxx_dB = 10*log10(Pxx);
plot(f, Pxx_dB);
2. 最大熵法(MEM)
% 使用arcov函数估计AR模型
order = 30; % 模型阶数(需调试)
AR_model = arcov(signal_data, order);
[h, f] = freqz(1, AR_model, N/2, fs);
Pxx = abs(h).^2;
plot(f, 10*log10(Pxx));
3. 小波变换
% 使用cwt函数
[cfs, f] = cwt(signal_data, 'amor', fs);
t = 0:1/fs:(length(signal_data)-1)/fs;
contour(t, f, abs(cfs), 'LineWidth', 1.5);
set(gca, 'YScale', 'log');
最终结论
不同方法从不同角度揭示信号特性,选择需结合实际需求(如分辨率、平滑性、泄漏抑制、计算资源)。FFT和Welch是最基础的“黄金标准”,其他方法则针对特定场景优化。