使用范例:

x=@(t)
(1+0.5*cos(9*pi*t)).*cos(200*pi*t+2*cos(10*pi*t))+sin(pi*t).*sin(30*pi*t);

t=0:0.01:9.99;

fs=1000;

y=x(t);

subplot(311);plot(t,y);

subplot(312);hua_fft(y,fs,1);%直接画出幅值谱

subplot(313);hua_fft(y,fs,1,0,250);%直接画出幅值谱,并且只画出0-250Hz范围的幅值谱

figure;

subplot(311);plot(t,y);

subplot(312);hua_baol(y,fs,1);%直接画出包络谱

subplot(313);hua_baol(y,fs,1,0,250);%直接画出包络谱,并且只画出0-250Hz范围的包络

画幅值谱函数源程序如下:

%画信号的幅频谱和功率谱

%频谱使用matlab例子表示

function hua_fft(y,fs,style,varargin)

%当style=1,画幅值谱;当style=2,画功率谱;当style=其他的,那么花幅值谱和功率谱

%当style=1时,还可以多输入2个可选参数

%可选输入参数是用来控制需要查看的频率段的

%第一个是需要查看的频率段起点

%第二个是需要查看的频率段的终点

%其他style不具备可选输入参数,如果输入发生位置错误

nfft= 2^nextpow2(length(y));%找出大于y的个数的最大的2的指数值(自动进算最佳FFT步长nfft)

%nfft=1024;%人为设置FFT的步长nfft

y=y-mean(y);%去除直流分量

y_ft=fft(y,nfft);%对y信号进行DFT,得到频率的幅值分布

y_p=y_ft.*conj(y_ft)/nfft;%conj()函数是求y函数的共轭复数,实数的共轭复数是他本身。

y_f=fs*(0:nfft/2-1)/nfft;?T变换后对应的频率的序列

% y_p=y_ft.*conj(y_ft)/nfft;%conj()函数是求y函数的共轭复数,实数的共轭复数是他本身。

if style==1

if nargin==3

plot(y_f,2*abs(y_ft(1:nfft/2))/length(y));%matlab的帮助里画FFT的方法

%ylabel('幅值');xlabel('频率');title('信号幅值谱');

%plot(y_f,abs(y_ft(1:nfft/2)));%论坛上画FFT的方法

else

f1=varargin{1};

fn=varargin{2};

ni=round(f1 * nfft/fs+1);

na=round(fn * nfft/fs+1);

plot(y_f(ni:na),abs(y_ft(ni:na)*2/nfft));

end

elseif style==2

plot(y_f,y_p(1:nfft/2));

%ylabel('功率谱密度');xlabel('频率');title('信号功率谱');

else

subplot(211);plot(y_f,2*abs(y_ft(1:nfft/2))/length(y));

ylabel('幅值');xlabel('频率');title('信号幅值谱');

subplot(212);plot(y_f,y_p(1:nfft/2));

ylabel('功率谱密度');xlabel('频率');title('信号功率谱');

end

end

画包络谱函数源程序如下:

function hua_baol (y,fs,style,varargin)

%画包络函数是hua_baoluo的代码简化版

%输入参数要么是3个,要么是5个

%当三个的时候

y_hht=hilbert(y);%希尔伯特变换

y_an=abs(y_hht);%包络信号

%y_an=y_an-mean(y_an);%去除直流分量

if nargin==3

hua_fft(y_an,fs,style);

elseif nargin==5

f1=varargin{1};

f2=varargin{2};

hua_fft(y_an,fs,style,f1,f2);

else

error('调用函数的输入参数数目不正确,输入参数只能是三个或者五个');

end

end

技术
下载桌面版
GitHub
百度网盘(提取码:draw)
Gitee
云服务器优惠
阿里云优惠券
腾讯云优惠券
华为云优惠券
站点信息
问题反馈
邮箱:[email protected]
QQ群:766591547
关注微信