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

该博客介绍了如何使用MATLAB读取wav文件并展示声音的3D频谱图和波形图。通过audioread函数获取音频数据,利用fft进行快速傅里叶变换,然后计算频谱并绘制图表。此外,还展示了使用specgram函数生成语谱图的方法,以及如何自定义创建语谱图。
摘要由CSDN通过智能技术生成

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

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值