给你两个例子参考参考(具体可参考《Matlab 7辅助信号处理技术与应用》):
x(n)的功率谱估计:
- clear all;
- Fs=1000;%采样频率
- %产生含有噪声的序列
- var=sqrt(1/exp(1.0));
- n=0:1/Fs:1;
- N=length(n);
- e=var*randn(1,N);
- w0=100*pi;
- w1=50*pi;
- xn=exp(j*w0*n-j*pi)+exp(j*w1*n-j*0.7*pi)+e;
- %绘制信号波形
- subplot(311)
- plot(n,abs(xn))
- xlabel('n')
- title('x(n)=exp(j*w0*n-j*pi)+exp(j*w1*n-j*0.7*pi)+e(n)')
- %计算序列的DFT
- nfft=1024;
- Xk=fft(xn,nfft);
- %计算序列的PSD
- Pxx1=abs(Xk).^2/N;
- %绘制功率谱图形
- index=0:round(nfft/2-1);
- k=index*N/nfft;
- plot_Pxx1=10*log10(Pxx1(index+1));
- subplot(312)
- plot(k,plot_Pxx1)
- ylabel('公式直接计算的功率谱')
- %periodogram函数计算的功率谱
- window=boxcar(length(xn));
- [Pxx2,f]=periodogram(xn,window,nfft,Fs);
- plot_Pxx2=10*log10(Pxx2(index+1));
- subplot(313)
- plot(k,plot_Pxx2)
- xlabel('periodogram函数计算的功率谱')
- x(n)的间接法功率谱估计:
- clear all;
- Fs=1000;% 采样频率
- % 产生含有噪声的序列
- var=sqrt(1/exp(1.0));
- n=0:1/Fs:1;
- N=length(n);
- e=var*randn(1,N);
- w0=100*pi;
- w1=50*pi;
- xn=exp(j*w0*n-j*pi)+exp(j*w1*n-j*0.7*pi)+e;
- % 绘制信号波形
- subplot(311)
- plot(n,abs(xn))
- xlabel('n')
- title('x(n)=exp(j*w0*n-j*pi)+exp(j*w1*n-j*0.7*pi)+e(n)')
- % 计算序列的自相关函数
- m=-500:500
- [r,lag]=xcorr(xn,500,'biased')
- subplot(312)
- hndl=stem(m,r);
- set(hndl,'Marker','.')
- set(hndl,'MarkerSize',2);
- ylabel('自相关函数R(m)')
- % 利用间接法计算功率谱
- k=0:1000;
- w=(pi/500)*k;
- M=k/500;
- X=r*(exp(-j*pi/500).^(m'*k));
- magX=abs(X);
- subplot(313)
- plot(M,10*log10(magX));
- xlabel('功率谱的BT法估计')
复制代码
|