在MATLAB中,可以使用多种方法来计算和绘制信号的功率谱图。以下是两种常见的方法及其相应的示例代码:
方法一:基于频域的功率谱估计(使用`pwelch`函数)
```matlab
% 参数设置
Fs = 1000; % 采样率
T = 1 / Fs; % 采样间隔
L = 1000; % 信号长度
t = (0 : L - 1) * T; % 时间向量
x = 0.7 * sin(2 * pi * 50 * t) + sin(2 * pi * 120 * t); % 信号
% 功率谱估计
window = 512; % 窗口长度
noverlap = 256; % 重叠长度
nfft = 1024; % 快速傅里叶变换点数
[Pxx, f] = pwelch(x, window, noverlap, nfft, Fs); % 计算功率谱
% 绘制功率谱图
semilogy(f, Pxx); % 绘制半对数功率谱图
title('Power Spectral Density');
xlabel('Frequency (Hz)');
ylabel('Power Spectral Density (dB/Hz)');
```
方法二:使用`periodogram`函数
```matlab
% 参数设置
Fs = 1000; % 采样率
t = 0 : 1 / Fs : 1; % 时间向量
f1 = 10; % 信号频率1
f2 = 20; % 信号频率2
x = sin(2 * pi * f1 * t) + sin(2 * pi * f2 * t); % 信号向量
% 计算功率谱
[Pxx, f] = periodogram(x, Fs); % 使用periodogram函数计算功率谱
% 绘制功率谱图
figure;
plot(f, 10 * log10(Pxx)); % 绘制功率谱图,将功率转换为分贝单位
xlabel('Frequency (Hz)');
ylabel('Power Spectral Density (dB/Hz)');
title('Power Spectrum');
grid on;
```
方法三:使用`fft`函数进行快速傅里叶变换
```matlab
% 参数设置
Fs = 1000; % 采样频率
N = 1024; % 数据长度
n = 0 : N - 1; % 时间序列
t = n / Fs; % 采用的时间序列
xn = sin(2 * pi * 50 * t) + 2 * sin(2 * pi * 120 * t) + randn(1, N); % 信号
% 计算功率谱
Pxx = 10 * log10(abs(fft(xn, Nfft).^2) / N); % Fourier振幅谱平方的平均值,并转化为dB
f = (0 : length(Pxx) - 1) * Fs / length(Pxx); % 频率序列
% 绘制功率谱图
subplot(2, 1, 1);
plot(f, Pxx); % 绘制功率谱曲线
xlabel('频率/Hz');
ylabel('功率谱/dB');
title('周期图 N=1024');
grid on;
% 调整频率轴
f = f(1 : length(f) / 2);
Pxx = Pxx(1 : length(Pxx) / 2 + 1);
```
方法四:使用自定义函数绘制功率谱图
你可以编写一个自定义函数,简化调用过程。以下是一个示例: