信号功率谱密度matlab,Matlab2019b中常用的音频信号分析,快速傅里叶(FFT),功率谱密度(PSD),以及通过FFT求取功率谱密度的问题...

本应该为基础知识的维纳辛钦定理的证明,在matlab调试中遇到的大坑。为了验证,本人编写了一个从求取FFT,到多种方法求取PSD的matlab程序。

问题主要集中在x轴和y轴应该如何取值的问题上,单纯计算出数值很容易,但是想把图画成一样的却很麻烦,网上基本搜不到相关的程序,都只是定理。

这个程序调试了三天才搞定,如果对你有帮助,请关注我,顺手点个赞,感谢。

%% 这个test主要是验证信号的FFT,PSD,以及使用FFT求取PSD的正确性

clear;

clc;

Fs = 1000; % Sampling frequency

T = 1/Fs; % Sampling period

L = 1500; % Length of signal

t = (0:L-1)*T; % Time vector

S = 0.7*sin(2*pi*50*t) ;%幅值为0.7频率为50的正弦信号

%% 信号的傅里叶FFT变换

Y = fft(S);

P2 = abs(Y/L);

P1 = P2(1:L/2+1);% 实信号的功率谱是对称的,只用取一半即可

P1(2:end-1) = 2*P1(2:end-1);

f = Fs*(0:(L/2))/L;

%% FFT获得功率谱密度PSD

Y = Y(1:L/2+1);% 实信号的功率谱是对称的,只用取一半即可

psdx = (1/(Fs*L)) * abs(Y).^2;% 注意使用采样频率和fft点数归一化

psdx(2:end-1) = 2*psdx(2:end-1);% 为了使得总功率不变,要乘以两倍

freq = 0:Fs/L:Fs/2;

%% Periodogram法测量谱密度PSD

[pxx,fp] = periodogram(S,rectwin(L),L,Fs);

%% pwelch法测量功率谱密度(PSD)

% noverlap=300;%重叠长度,

% Lc=500;%窗函数长度

% nfft=500;%nfft点数

% [pxx,fp]=pwelch(S,...

% hamming(Lc),...

% noverlap,...

% nfft,...

% Fs,...

% 'onesided',...

% 'power');

%% 自相关系数求功率谱密度PSD

[r,lags]=xcorr(S,500,'coeff');%信号S的自相关

Pr=fft(r);%自相关的傅里叶变换

L1=size(Pr,2);

Lr=size(r,2);%自相关变换后的数据长度

L3=abs(Pr/Lr);

L4=L3(1:Lr/2+1);% 实信号的功率谱是对称的,只用取一半即可

L4(2:end-1)=2*L4(2:end-1);

f1=Fs*(0:(Lr/2))/Lr;%套用单边变换FFT横坐标变换

%% 绘图部分

subplot(4,1,1)

plot(f1,L4)

title('自相关函数傅里叶正变换')

grid on

xlabel('Frequency (Hz)')

ylabel('Amplitude')

%stem(lags,r)

subplot(4,1,2)

plot(freq,pow2db(psdx))

grid on

title('使用FFT法测量功率谱密度')

xlabel('Frequency (Hz)')

ylabel('Power/Frequency (dB/Hz)')

subplot(4,1,3)

plot(f,P1)

title('原始信号直接进行傅里叶分析')

grid on

xlabel('Frequency (Hz)')

ylabel('Amplitude')

subplot(4,1,4)

plot(fp,pow2db(pxx));

title('Periodogram法测量谱密度PSD')

grid on

xlabel('Frequency (Hz)')

ylabel('Power/Frequency (dB/Hz)')

Copyright © 2020 by RichardYang. All rights reserved.

仅供参考,严禁转载,感谢。

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
总结一下FFT和维纳辛钦定理求解PSD问题-功率谱.rar 早上在论坛上问了两个问题, 一个是关于FFT求频谱时纵坐标的值问题 https://www.ilovematlab.cn/thread-27092-1-1.html 还有一个是用维纳辛钦定理求解PSD时出现的问题 https://www.ilovematlab.cn/thread-27133-1-1.html 经过达人们的指点,和自己的总结,获得一点心得,在这里与大家分享一下:) 1.FFT求频谱 [CODE] Fs = 40; n = 0:1/Fs:159*1/Fs; x = sin sin; N = length; X = fftshift); Px1 = X.*conj/N; plot*Fs/N,Px1); grid on; axis title; 首先,fftshift的问题,以前上数字信号处理时,老师专门给提出了这个函数,但是我发现论坛里好多不太明白这个函数意义的,OO~,一般,fft得到的是频谱范围在【0-2*pi】范围内的频谱,以高频pi为心,但是一般使用过程,使用的频谱习惯以低频0为心,fftshift的功能就是将频谱进行移位,使之在【-pi,pi】之间; 另外,纵坐标的问题,版主edifier2008提示说用/N的方法归一化,我试了一下,每次采样长度变大时,纵坐标的整体值都会变大,/N之后,值变为1之内了,但是并不是理论算法得到的1. 形如下: fft.jpg fft 2.维纳辛钦定理求解功率谱的问题 [CODE] Fs = 40; n = 0:1/Fs:159*1/Fs; x = sin sin; N = length; Rx = xcorr; Px2 = fftshift); plot*Fs/,abs); grid on; axis title; 形如下: fftwei.jpg 程序可以看出,也要使用fftshift对fft得到的频谱进行移位以得到以低频0为心的频谱,另外,得到的功率谱纵轴值特别大,是不是也需要除以采样长度,我试了一下,仍然是很大,个人认为,在MATLAB计算自相关函数以及计算FFT时,都没有对加和进行归一,将/N这一个系数可能都给省略掉了。 此外,我在很多教材里面看了不少里面的例题,都没有注意纵轴值的问题,我觉得在进行频谱分析,重点在于频率点,以及相近频率点的谱是不是能够分辨出来,而对于各谱的大小,有个相对的比较即可。 不当之处,还望大家给与指正,:) :victory:
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值