luyunjun023 发表于 2008-12-15 17:13

matlab如何实现功率谱幅值曲线

我有一列响应数据,4096行。
怎么用matlab实现功率谱曲线。谢谢!

如果有几列数据,互功率谱曲线怎么画。

多谢!!!急!

luyunjun023 发表于 2008-12-15 18:10

期待有人帮忙

yuxma 发表于 2008-12-15 22:57

可以用pwelch命令

csvscs 发表于 2008-12-16 09:35

本帖最后由 wdhd 于 2016-9-13 14:04 编辑

PWELCH Power Spectral Density estimate via Welch's method.
    Pxx = PWELCH(X) returns the Power Spectral Density (PSD) estimate, Pxx, of a discrete-time signal vector X using Welch's averaged,modified periodogram method.By default, X is divided into eight sections with 50% overlap, each section is windowed with a Hamming window and eight modified periodograms are computed and averaged.

    If the length of X is such that it cannot be divided exactly into eight sections with 50% overlap, X will be truncated accordingly.

    Pxx is the distribution of power per unit frequency. For real signals, PWELCH returns the one-sided PSD by default; for complex signals, it returns the two-sided PSD.Note that a one-sided PSD contains the total power of the input signal.

csvscs 发表于 2008-12-16 09:36

本帖最后由 wdhd 于 2016-9-13 14:05 编辑

See also periodogram, pcov, pmcov, pburg, pyulear, peig, pmtm, pmusic, spectrum/welch, dspdata/psd, dspdata/msspectrum.

luyunjun023 发表于 2008-12-19 09:51

多谢回复!
有人能给出详细的中文回答吗?英文不好。

camel2018 发表于 2008-12-19 10:45

nfft=4096;
p=abs(fft(x,nfft));%x为你的数列名称
plot((0:nfft/2-1)/nfft*fs,p(1:nfft/2));% 即可画出功率谱曲线

xsy710 发表于 2008-12-19 20:18

本帖最后由 wdhd 于 2016-9-13 14:05 编辑

原帖由 camel2018 于 2008-12-19 10:45 发表
nfft=4096;
p=abs(fft(x,nfft));%x为你的数列名称
plot((0:nfft/2-1)/nfft*fs,p(1:nfft/2));% 即可画出功率谱曲线
好像不对吧,这样画出来的是FFT变换后的幅值谱,不是功率谱

hahaer 发表于 2008-12-19 22:38

这个论坛中好像有啊
多搜索下啊
我把我以前找到的贴一下
你参考下
把load data换成你的数据就行了

clear;

load x1.mat;
load y.mat;

y = y - mean(y);

plot(x,y);

%% 经典功率谱估计
Fs=416.6667; %采样频率
window=boxcar(length(y)); %矩形窗
nfft=512;
=periodogram(y,window,nfft,Fs); %直接法

figure
plot(f,Pxx);

%% 间接法
% Fs=100; %采样频率
% nfft=416.6667;
% cxn=xcorr(y,'unbiased'); %计算序列的自相关函数
% CXk=fft(cxn,nfft);
% Pxx=abs(CXk);
% index=0:round(nfft/2-1);
% k=index*Fs/nfft;
% plot_Pxx=10*log10(Pxx(index+1));
% plot(k,plot_Pxx);

%% Bartlett法(改进方法一)
% Fs=100;
% nfft=416.6667;
% window=boxcar(256); %矩形窗
% noverlap=0; %数据无重叠
% p=0.9; %置信概率
% =psd(y,nfft,Fs,window,noverlap,p);
% index=0:round(nfft/2-1);
% k=index*Fs/nfft;
% plot_Pxx=(Pxx(index+1));
% plot_Pxxc=(Pxxc(index+1));
% figure(1)
% plot(k,plot_Pxx);
% pause;
% figure(2)
% plot(k,);

%% 韦尔奇法

% Fs=100;
% nfft=416.6667;
% window=boxcar(100); %矩形窗
% window1=hamming(100); %海明窗
% window2=blackman(100); %blackman窗
% noverlap=20; %数据无重叠
% range='half'; %频率间隔为,只计算一半的频率
% =pwelch(y,window,noverlap,nfft,Fs,range);
% =pwelch(y,window1,noverlap,nfft,Fs,range);
% =pwelch(y,window2,noverlap,nfft,Fs,range);
% plot_Pxx=(Pxx);
% plot_Pxx1=(Pxx1);
% plot_Pxx2=(Pxx2);
%
% figure(1)
% plot(f,plot_Pxx);
%
% pause;
%
% figure(2)
% plot(f,plot_Pxx1);
%
% pause;
%
% figure(3)
% plot(f,plot_Pxx2);

luyunjun023 发表于 2008-12-20 13:53

多谢!问题已解决!

luyunjun023 发表于 2008-12-20 13:56

另外一个问题,我有一个3*4096的矩阵,想用它来构造hankel矩阵,比如说构造为30*30的hankel矩阵,改怎么做?
直接hankel不行。初学者,多谢!
页: [1]
查看完整版本: matlab如何实现功率谱幅值曲线