声音显示波形图及频谱matlab

2018-11-24  本文已影响0人  sunnylxs

%该程序读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('自己做的语谱图');

上一篇 下一篇

猜你喜欢

热点阅读