【语音识别】基于matlab傅立叶变换0-9数字语音识别【含Matlab源码 384期】

86 阅读6分钟

一、简介

1 滤波
滤波是将信号中特定波段频率滤除的操作,是抑制和防止干扰的一项重要措施。是根据观察某一随机过程的结果,对另一与之有关的随机过程进行估计的概率理论与方法。
滤波分为经典滤波和现代滤波两种。
经典滤波:
经典滤波的概念,是根据傅里叶分析和变换提出的一个工程概念。根据高等数学理论,任何一个满足一定条件的信号,都可以被看成是由无限个正弦波叠加而成。换句话说,就是工程信号是不同频率的正弦波线性叠加而成的,组成信号的不同频率的正弦波被叫做信号的频率成分或叫做谐波成分。
滤波器:
只允许一定频率范围内的信号成分正常通过,而组织另一部分频率成分通过的电路。叫做经典滤波器或滤波电路。实际上,任何一个电子系统都具有自己的频带宽度(对信号最高频率的限制),频率特性反映了电子系统的这个基本特点。而滤波器,则是根据电路参数对电路频带宽度的影响而设计出来的工程应用电路。
现代滤波
用模拟电子电路对模拟信号进行滤波,其基本原理就是利用电路的频率特性实现对信号中频率成分的选择。根据频率滤波时,是把信号看成是由不同频率正弦波叠加而成的模拟信号,通过选择不同的频率成分来实现信号滤波。
1、当允许信号中较高频率的成分通过滤波器时,这种滤波器叫做高通滤波器。
2、当允许信号中较低频率的成分通过滤波器时,这种滤波器叫做低通滤波器。
3、设低频段的截止频率为fp1,高频段的截止频率为fp2:
1)频率在fp1与fp2之间的信号能通过其它频率的信号被衰减的滤波器叫做带通滤波器。
2)反之,频率在fp1到fp2的范围之间的被衰减,之外能通过的滤波器叫做带阻滤波器。
理想滤波器的行为特性通常用幅度-频率特性图描述,也叫做滤波器电路的幅频特性。

2 傅里叶变换
傅里叶变换是一种积分变换,就是一种从时间到频率的变化。傅里叶原理表明:任何连续测量的时序或信号,都可以表示为不同频率的正弦波信号的无限叠加。可以说,傅里叶变化将原来难以处理的时域信号转化成了易于分析的频率信号(信号的频谱)。
图像的频率是表征(知识在个体心理的反映和存在方式)图像中灰度变化剧烈的程度的指标,是灰度在平面空间上的梯度。图像中是一片灰度变化很缓慢的区域,对应的频率值很低,反之亦然。
从纯粹的数学意义上看,傅里叶变换是将一个函数转化为一系列周期函数来处理。从物理效果看,傅里叶变化是将图像从空间域转换到频率域,其逆变换是将图像从频率转换到空间域。换句话说,傅里叶变换的物理意义是将图像的灰度分布函数转变为图像的频率分布函数,傅里叶逆变化是将图像的频率分布函数变换为灰度分布函数。

3 傅里叶变换的性质
平移性质
在这里插入图片描述
1
2
公式(1)表明将f(x,y)与一个指数项相乘就相当于把其变换后的频域中心移动到新的位置
公式(2)表明将F(u,v)与一个指数项相乘就相当于把其变换后的空域中心移动到新的位置
公式(2)表明对f(x,y)的平移不影响其傅里叶变换的幅值
分配率
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

二、源代码

clear all
close
clc;
disp('正在计算参考模板的参数...')
for i=1:10
fname=sprintf('%d0.mp3',i-1);
[x,fs]=audioread(fname);
sound(x,fs);
  [x1 x2]=vad(x);
%   x1=abs(round(x1));
%   x2=abs(round(x2));
  m=mfcc(x);
  m=m(x1-2:x2-4,:);
  ref(i).mfcc=m;
end

disp('正在分析语音信号...')
for i=1:10
fname=sprintf('%d0.mp3',i-1);
%[x,fs,bit]=audioread(fname,[2000,2512]);     %采样%
[x,fs]=audioread(fname,[2000,2512]);
%sound(x,fs);      %播放语音信号
figure(i);
subplot(3,3,1);
plot(x(1:256));    %原始语音信号的时域图形%
title('原始信号')
subplot(3,3,2)
[h,w]=freqz(x,fs);      %原始语音信号的频率响应图
hr=abs(h);            %求系统幅频响应
plot(w,hr);
title('幅频图');
xlabel('Frequency in rad mple')
ylabel('Magnitude in dB')
subplot(3,3,3)
hphase=angle(h);
hphase=unwrap(hphase);  %求系统相频响应
plot(w,hphase);
title('相频图');
xlabel('Frequency in rad mple')
ylabel('Phase in degrees')
y=fft(x,512);      %傅立叶变换%
mag=abs(y);
mag1=10*log10(mag);
f=fs*(0:255)/512;
subplot(3,3,4)
plot(f,mag(1:256));   %FFT频谱图 %
title('fft变换后信号')
iff=ifft(y,512);   %反傅立叶变换%
ifm=abs(iff);
subplot(3,3,5)
plot(f,ifm(1:256))
title('ifft后信号')
% 短时傅里叶变换
Ts=1/fs;
%N=T/Ts;
N=512;
Nw=20;     %窗函数长
L=Nw/2;    %窗函数每次移动的样点数   
Tn=(N-Nw)/L+1;    %计算把数据x共分成多少段
nfft=32;%FFT的长度
Tn=round(Tn);
TF=zeros(Tn,nfft);   %将存放三维谱图,先清零
for i=1:Tn
    xw=x((i-1)*10+1:i*10+10);    %取一段数据
    temp=fft(xw,nfft);           %FFT变换
    temp=fftshift(temp);         %频谱以0频为中心
    for j=1:nfft
    TF(i,j)=temp(j);                %把谱图存放在TF中
    end
end
subplot(3,3,6)
fnew=((1:nfft)-nfft/2)*fs/nfft;
tnew=(1:Tn)*L*Ts;
[F,T]=meshgrid(fnew,tnew);
mesh(F,T,abs(TF))
title('短时傅立叶变换时频图')
subplot(3,3,7)
contour(F,T,abs(TF))
title('等高线表示')
end
function cost=testdtw(t,r)
[r1,c1]=size(t);
[r2,c2]=size(r);
distance=zeros(r1,r2);
for n=1:r1
    for m=1:r2
        tr=(t(n,:)-r(m,:)).^2;
        distance(n,m)=sqrt(sum(tr)/c1);
        %distance(n,m)=sqrt(sum(tr)/c1);
    end
end
D=zeros(r1,1);
function f=enframe(x,win,inc)
nx=length(x(:));
nwin=length(win);
if (nwin == 1)
   len = win;
else
   len = nwin;
end
if (nargin < 3)
   inc = len;
end
function cost=Idtw(t,r)
[r1,c1]=size(t);
[r2,c2]=size(r);
distance=zeros(r1,r2);
for n=1:r1
    for m=1:r2
        tr=(t(n,:)-r(m,:)).^2;
        distance(n,m)=sqrt(sum(tr)/c1);
        %distance(n,m)=sqrt(sum(tr)/c1);
    end
end

三、运行结果

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

四、备注

版本:2014a