luca_fr 发表于 2013-11-14 22:05
今天搞了一下,确实行了,这里的功率谱PSD应该就是自功率谱密度吧;不过只能求滤波,FFT,平均功率谱, ...
首先你的最开始贴出的信号,我不知道是测什么得出的,再就是采样率你也没说,所以你上面提到的几个问题,我也无从解释。
今天我就简单说一下如何用matlab计算稳态信号的频谱(线性谱),自谱密度,其中包括如何加窗函数以及如何修正加窗后的影响。clear
clc
%生成仿真信号,用于下面的信号运算演示
fs=5000;
T=1/fs;
L=10*fs;
t=(0:L-1)*T;
x=sin(2*pi*300*t)+2*sin(2*pi*1000*t)+3;
% %开始替换数据
% load('CH3.mat')
% n_1.x_values.increment=T;%替换采样时间间隔
% n_1.x_values.number_of_values=L;%替换数据长度
% n_1.y_values.values=x;%替换信号
% save('abcde.mat','n_1')
%加窗
win=hann(L); %这里选用汉宁窗,你可以使用任意窗函数
x1= x'.*win; %加窗
%fft运算
X=fft(x1);
AX=abs(X/sum(win)); %幅值归一化并对加窗修正
%双边谱转单边谱
SAX(1)=AX(1);
SAX(2:L/2+1)=2*AX(2:L/2+1);
%计算频率轴
f=fs/2*linspace(0,1,L/2+1);
subplot(3,1,1)
plot(f,SAX)
axis([min(f) max(f) min(SAX) max(SAX)+0.5])
title('线性谱')
%计算功率谱密度
%1、周期图法
[pxx1,f1]=periodogram(x,win,L,fs);
pxx1(1)=pxx1(1);
pxx1(2:L/2+1)=2*pxx1(2:L/2+1);
subplot(3,1,2)
plot(f1,pxx1)
axis([min(f1) max(f1) min(pxx1) max(pxx1)+0.5])
title('周期图法-自谱密度')
%2、平均周期图法
nfft=5000; %设置每一次变换长度
noverlap=2500; %设置重叠点数
win1=hann(nfft);
[pxx2,f2]=pwelch(x,win1,noverlap,nfft,fs);
pxx2(1)=pxx2(1);
pxx2(2:nfft/2+1)=2*pxx2(2:nfft/2+1);
subplot(3,1,3)
plot(f2,pxx2)
axis([min(f2) max(f2) min(pxx2) max(pxx2)+0.5])
title('平均周期图法-自谱密度')
从计算结果来看与LMS结果完全吻合,实际上这组仿真信号也很简单,不用和LMS对比,也能知道结果的准确性
|