600字范文,内容丰富有趣,生活中的好帮手!
600字范文 > matlab 显示3d频谱_声音显示波形图及频谱matlab

matlab 显示3d频谱_声音显示波形图及频谱matlab

时间:2021-11-23 14:39:46

相关推荐

matlab 显示3d频谱_声音显示波形图及频谱matlab

%该程序读wav文件,然后显示频谱以及波形。注意wav文件不要太长,否则运算会很慢。

[y,fs]=audioread('17-30.wav');

fs

sigLength=length(y);

Y = fft(y,sigLength);

Pyy = Y.* conj(Y) / sigLength;

halflength=floor(sigLength/2);

f=fs*(0:halflength)/sigLength;

figure;plot(f,Pyy(1:halflength+1));xlabel('频率/Hz'); ylabel('幅度');

t=(0:sigLength-1)/fs;

figure;plot(t,y);xlabel('时间/s');ylabel('幅度');

%%%%画出声音对应的频谱图

clear all;

clc;

[w,fs,bits]=wavread('17-30.wav');%读取声音数据,fs表示采样频率(Hz),bits表示采样位数。

figure;

%subplot(1,3,1);

plot(w);

title('原始语音');

axis([1 length(w) -1 1]);

grid;

%用specgram函数做语谱图

Nf=512;%FFT采样点数

FrameLen=160;%帧长

FrameInc=80;%帧移,

FrameCha=FrameLen-FrameInc;%帧差

figure;

%subplot(1,2,1);

specgram(w,Nf,fs,FrameLen);

colormap gray

%specgram(a,nfft,fs,window),nfft指定specgram函数所用FFT长度

%,该值决定了计算短时傅立叶变换的各频点;参数fs是指定采样频率的一个标量;

%参数window指定了一个窗函数以及specgram函数用以分割矢量a的样点数;

title('specgram语谱图');

%分帧

N=length(w);%语音长

Num=ceil((N-FrameLen)/FrameCha)+1;%分帧数目

yframe=enframe(w,FrameLen,FrameInc);%调用分帧函数,函数enframe.m中对每帧数据加Hamming窗

Win=hamming(FrameLen);%定义汉明窗

A=[];%存放FFT后的数据

for i=1:Num

ys=yframe(:,i).*Win;%对每帧数据加窗

ys=fft(ys,Nf);

ys=ys(1:Nf/2);

%ys=fftshift(ys);%作用:将零频点移到频谱的中间

ys=abs(ys);%傅里叶变换取模

ys=(ys.^2)/FrameLen;

ys=10*log10(ys);

A(:,i)=ys;

end

%自己做的语谱图

figure;

%subplot(1,2,2);

x=0:0.01:N/fs;%横轴时间

y=[0:Nf/2]*fs/Nf;

imagesc(x,y,A);%将输入变量L显示为图像,并且使用x和y变量确定x轴和y轴的边界。

axis xy;

title('自己做的语谱图');

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。