间接法求功率谱密度之自相关函数---基于MATLAB

方法:先由序列x(n)估计出自相关函数R(n),然后对R(n)进行傅里叶变换,便得到x(n)的功率谱估计。

(1)、自相关函数
求解步骤:(1)移位;(2)相乘;(3)相加。

function y = myXcorr(x)
%输入x:长度为n的一维行向量
%输出y:长度为2n-1的一维行向量
%求解步骤:(1)移位;(2)相乘;(3)相加.
n = length(x); %输入行向量的长度
y = zeros(1,2*n-1);  %提前分配输出行向量的空间
for i = 1:n
    %利用前后补0进行移位操作
    x1 = [zeros(1,n-i), x];  
    x2 = [x, zeros(1,n-i)];  
    y([i,2*n-i]) = x1*x2';   %进行相乘和相加操作
end

验证:

clc
clear

a1 = [8 7 2 4 6 8];
a2 = [5 6 8 7 4 1 2];

b1 = xcorr(a1)  %MATLAB内置函数计算结果
c1 = myXcorr(a1)  %自编MATLAB函数计算结果

b2 = xcorr(a2)  %MATLAB内置函数计算结果
c2 = myXcorr(a2)  %自编MATLAB函数计算结果

结果:
在这里插入图片描述
(2)求功率谱密度

clc;
clear;

Fs = 1000;  %采样频率
n = 0:1/Fs:1;

xn = cos(2*pi*40*n) + 3*cos(2*pi*100*n) + randn(size(n));   %含噪声信号
nfft = 1024;

% 间接法
%%% 间接法先由序列x(n)估计出自相关函数R(n),然后对R(n)进行傅里叶变换,便得到x(n)的功率谱估计。

%计算序列的自相关函数
cxn = xcorr(xn);  
mycxn = myXcorr(xn);  

CXk = fft(cxn,nfft);    myCXk = myfft(mycxn,nfft);
Pxx = abs(CXk);         myPxx = abs(myCXk);
index = 0:round(nfft/2-1);
k = index*Fs/nfft;
plot_Pxx = 10*log10(Pxx(index+1));     myplot_Pxx = 10*log10(myPxx(index+1));
subplot(211);    plot(k,plot_Pxx);          title('间接法---内置MATLAB函数');
subplot(212);    plot(k,myplot_Pxx);        title('间接法---自编MATLAB函数');

代码中myfft函数见https://blog.csdn.net/xq_520/article/details/102501908

验证结果(部分截图):
傅里叶变换:
在这里插入图片描述
功率谱密度计算结果:
在这里插入图片描述
在这里插入图片描述

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值