语音信号的分帧加窗的matlab实现
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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);