matlab信号代码
时间: 2024-12-27 18:14:51 浏览: 0
### MATLAB 信号处理示例代码
#### FFT 频谱和功率谱绘制
为了展示如何使用MATLAB进行基本的信号处理操作,下面提供了一个用于计算并绘制动态信号快速傅里叶变换(FFT)频谱及其对应的功率谱密度的例子[^1]。
```matlab
% 参数设置
Fs = 1000; % 采样频率 (Hz)
T = 1/Fs; % 采样周期 (秒)
L = 1500; % 信号长度
t = (0:L-1)*T; % 时间向量
% 创建合成测试信号
S = 0.7*sin(2*pi*50*t) + sin(2*pi*120*t);
X = S + 2*randn(size(t)); % 添加随机噪声形成最终信号
% 执行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;
figure;
subplot(2,1,1);
plot(f,P1)
title('单侧幅度谱 |X(f)|')
xlabel('频率 f (Hz)')
ylabel('|X(f)|')
subplot(2,1,2);
plot(f,P1.^2)
title('单侧功率谱 |X(f)|^2')
xlabel('频率 f (Hz)')
ylabel('Power')
```
此段脚本首先定义了一些必要的参数来构建一个含有两个正弦波分量加上高斯白噪声音轨的人工数据集。接着通过`fft()`函数执行快速傅里叶变换,并分别展示了双边与单边振幅谱以及相应的功率谱图像。
#### EMD 分析及 Hilbert 谱可视化
除了传统的基于傅氏理论的方法外,在现代非线性和非平稳数据分析领域内经验模态分解(EMD)技术也得到了广泛应用。这里给出了一段简单的例子用来说明怎样应用 `emd` 函数来进行IMF提取,并进一步生成希尔伯特黄变(HHT)相关图表:
```matlab
% 对原始信号 X 进行 EMD 分解得到 IMF 成分
imf = emd(X);
% 绘制各阶次 IMF 的时间序列图
for k=1:length(imf)
subplot(length(imf),1,k);
plot(t, imf{k});
title(['IMF ', num2str(k)]);
end
% 使用 hht() 来获取瞬时相位、瞬时频率和包络曲线
[h,tfr,freq] = hht(imf,Fs);
% 显示 HHT 结果中的 Hilbert 黄谱
figure;
pcolor(t,freq,h);
shading interp;
axis tight;
xlabel('Time');
ylabel('Frequency');
title('Hilbert-Huang Transform');
% 展现边际谱分布情况
marginal_spectrum = sum(h,[],2);
figure;
plot(freq,marginal_spectrum,'LineWidth',2);
xlabel('Frequency');
ylabel('Amplitude');
title('Marginal Spectrum of the Signal');
```
上述代码片段实现了对输入信号 `X` 应用 EMD 方法获得多个固有模式函数(IMF),随后利用这些 IMFs 构建了完整的希尔伯特-黄变换表示形式——即所谓的“能量-频率-时间”的三维映射关系[HHT]。最后还提供了关于边缘谱的信息,这有助于理解不同频率成分在整个观测期间内的相对重要性变化趋势。
阅读全文