语音信号的分帧加窗的matlab实现

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

语音信号的分帧加窗的matlab实现

function Seg=segment(signal,W,SP,Window)

if nargin<3

SP=.4;

end

if nargin<2

W=256;

end

if nargin<4

Window=hamming(W);

end

Window=Window(:); %make it a column vector

L=length(signal);

SP=fix(W.*SP);

N=fix((L-W)/SP +1); %number of segments

Index=(repmat(1:W,N,1)+repmat((0:(N-1))'*SP,1,W))';

hw=repmat(Window,1,N);

Seg=signal(Index).*hw;

语音信号处理预加重、加窗分帧matlab程序

%获取语音信号

[filename,pathname]=uigetfile('*.wav','choose a audio file:');

[wavin,fs,nbits]=wavread([pathname filename]);

wav_l=length(wavin); %采样点数,length()返回值是标量

frame_l=0.04*fs; %根据fs选择帧长,

step_l=floor(0.5*frame_l); %设置帧移

num_frame=floor((wav_l-frame_l)/step_l)+1; %确定帧数

win_ham=hamming(frame_l); %在做fft之前,为移除直流分量和加重高频分量,采用汉明窗,对信号进行加权

%加窗处理用来消除分帧时带来的截断效应

%加窗,分帧(矩阵每一行为一帧)

for i=1:num_frame

n1=(i-1)*step_l+1;

n2=(i-1)*step_l+frame_l;

zy(i,:)=(win_ham').*(yt(n1:n2)'); %存储每一帧噪音(行向量) %win_ham、yt 是列向量,需转置

yy(i,:)=(win_ham').*(wavin(n1:n2)'); %存储每一帧纯净语音

end

关于matlab中的语音识别

在用DFT求得倒普之后。为什么需要加上倒普提升窗口呢??谢谢!

窗函数是这样的:w = 1+6*sin(pi*[1:12]./12); 为什么要这样计算呢??以下是具体的程序~~

%%%%%文件"mfcc.m"

function ccc=gbfcosmfcc(x)

%归一化mel滤波器组系数

bank=melbankm(24,256,16000,0,0.5,'m');

bank=full(bank);

bank=bank/max(bank(:));

%DCT系数,12*24

for k=1:12

n=0:23;

dctcoef(k,:)=cos((2*n+1)*k*pi/(2*24));

end

%归一化倒谱提升窗口

w=1+6*sin(pi*[1:12]./12);

w=w/max(w);

%预加重滤波器

xx=double(x);

xx=filter([1 -1],1,xx);

xx=x; %zhang add

%语音信号分帧

%xx=enframe(xx,256,80);

xppl=length(xx);

j=1;

for i=65:80:xppl-256,

xx1(j,:)=xx(i:i+256-1)';

j=j+1;

end

xx=xx1;

%计算每帧的MFCC参数

for i=1:size(xx,1)

y=xx(i,:);

s=y'.*hamming(256);

t=abs(fft(s));

t=t.^2;

t=t+2*realmin;

log(bank*t(1:129))

c1=dctcoef*log(bank*t(1:129))

c11=Disfrcthe(1,24)*log(bank*t(1:129))

c2=c1.*w';

m(i,:)=c2';

end

%差分参数

dtm=zeros(size(m));

for i=3:size(m,1)-2

dtm(i,:)=-2*m(i-2,:)-m(i-1,:)+m(i+1,:)+2*m(i+2,:);

end

dtm=dtm/3;

%合并mfcc参数和一阶差分mfcc参数

ccc=[m dtm];

%去除首尾两帧,因为这两帧的一阶差分参数为0

ccc=ccc(3:size(m,1)-2,:);

return

利用MATLAB录制并保存声音文件

R = audiorecorder( 44100, 16 ,2 ) ;

%创建一个保存音频信息的对象,它包含采样率,时间和录制的音频信息等等

record(R);

%开始录制,此时对着麦克风说话即可。

pause(R);

%暂停录制。

play(R)

%播放录制的声音。

myspeech = getaudiodata(R);

%得到以n*2列数字矩阵存储的刚录制的音频信号。

save sp myspeech

plot(myspeech)

%画出波形

声音信号时域分析程序

wavwrite(myspeech,44100,16,'myspeech');

%myspeech表示要存入的波形矩阵,44100表采样率,16 为以16bits存储,'myspeech'为存储的文件名。

waveFile='myspeech';

[y, fs, nbits]=wavread(myspeechfile);

a=0.95;

y2 = filter([1, -a], 1, y);

相关文档
最新文档