怎么用MATLAB画实数信号的功率谱?
1、首先,生成一个离散的实数信号。这里以x=2*cos(3*pi*t)信号为例,借助EXCEL将其离散化。采样率fs取50,采样点数N取100。

2、然后,在MATLAB中调取我们刚刚所生成的离散实数信号。我把包含该信号的EXCEL文件命名为signal_x_data,并放在了C盘根目录下,如果你采用和我同样的设置,调取时可以直接复制下面的命令:
x=xlsread('C:\signal_x_data.xlsx'); % 加载xlsx文件
x=x(:,3); % 取位于第三列的信号数据

3、接着,我们对该实数信号作傅里叶变换,再取所得变换结果的绝对值的平方。这一步除了可以采用命令:
xfft=fft(x);
P=abs(xfft).*abs(xfft);
也可以采用命令:
xfft=fft(x);
P=(xfft).*conj(xfft);
可以看到,两种算法的结果是一致的(误差极小,例如在1e-12以内,即可认为结果一致)。我们所求得的P转化为分贝后即为功率谱中各点的纵坐标值。

4、于是,我们可以作出实数信号的功率谱。横坐标为频率f=0:1*fs/N:fs-1*fs/N,可以直接复制下面的命令:
fs=50;
N=100;
f=0:1*fs/N:fs-1*fs/N;
figure(1);
subplot(1,2,1);
plot(1/fs:1/fs:N/fs,x);
xlabel('Time/s');
ylable('Amplitude');
title('时域信号');
subplot(1,2,2);
plot(f,20*log10(P));
xlabel('Frequency/Hz');
ylabel('Power/dB');
title('功率谱');
左边图反映信号时域变化,右边图为信号的功率谱。

5、简介中提到:实数信号的功率谱包含正负频率成分,但上述功率谱的横坐标却并非如此。这里,实际上需要用到fftshift命令进行变换,可以直接复制下面的命令:
figure(2);
f=floor(-N/2)/N*fs:1*fs/N:(ceil(N/2)-1)/N*fs;
plot(f,20*log10(fftshift(P)));
这便是最终的功率谱,它包含了-1.5Hz和+1.5Hz这两个主要的频率成分。

1、总结一下步骤,画实数信号功率谱的整个过程大致分为5步:
1、用EXCEL生成离散的实数信号;
2、在MATLAB中调取所生成的信号;
3、对信号作傅里叶变换,并求功率;
4、绘出初步的功率谱;
5、用fftshift命令进行变换得到最终的功率谱。