语音信号的频域分析

语音信号的频域分析

语音的感知过程与人类听觉系统具有频谱分析功 能紧密相关。因此,对语音信号进行频谱分析, 是认识语音信号和处理语音信号的重要方法

声音从频率上可以分为纯音和复合音。纯音只含 一种频率的声音(基音),而没有倍音。复合音是 除基音外,还包含多种倍音的声音。大部分声音 (包括语音)都是复合音,涉及多个频率段。

离散傅里叶变换(DFT)

复指数运算:
在这里插入图片描述

  • 实部是Cosine函数,虚部是Sine函数

时间系列的复指数运算是两个时间系列的复数和:
在这里插入图片描述
两个不同频率的复指数运算是相互正交的,即:
在这里插入图片描述

  • 例如:正是因为相互正交,才能分开
    在这里插入图片描述

傅里叶变换的第k个点计算如下:
在这里插入图片描述

  • 其中:
    • x[m]是时域波形第m个采样点
    • X[k]是傅里叶频谱第k个点
    • N是采样系列里的点数

时域信号可以从DFT恢复得到:(但是相差1/N)
在这里插入图片描述

离散傅里叶变换的特质

  • 时域波形的M个点经DFT后,仍对应M个点
  • 假设采样率是8000Hz,第0个点代表0Hz,第M1个点代表(M-1)/M*8000Hz
  • M个点在频率轴平均分布
  • 快速傅里叶变换(FFT)是DFT的快速算法

在这里插入图片描述

  • 可以出0-4000Hz与4000-8000Hz是对称的,所以只需要显示一半
  • 0Hz代表直流,即常数
  • 时域多少个点,频域也就多少个点,如果不一样,则是在后面补零,如下所示:
>> A=[1 2 3 4]
>> fft(A, 8)

ans =

  1 至 6 列

  10.0000 + 0.0000i  -0.4142 - 7.2426i  -2.0000 + 2.0000i   2.4142 - 1.2426i  -2.0000 + 0.0000i   2.4142 + 1.2426i

  7 至 8 列

  -2.0000 - 2.0000i  -0.4142 + 7.2426i


>> A1=[1 2 3 4 0 0 0 0];
>> fft(A1, 8)

ans =

  1 至 6 列

  10.0000 + 0.0000i  -0.4142 - 7.2426i  -2.0000 + 2.0000i   2.4142 - 1.2426i  -2.0000 + 0.0000i   2.4142 + 1.2426i

  7 至 8 列

  -2.0000 - 2.0000i  -0.4142 + 7.2426i

短时傅里叶变换

标准傅里叶分析在信号处理中具有非常重要的作 用。适用于周期、瞬变或平稳随机信号的分析

语音信号是一个非平稳过程,所以标准傅里叶分析不能直接进行。因语音信号具有短时特性,所以可以采用短时傅里叶变换,即有限长度的傅里叶变 换。相应的谱称为“短时谱”

傅里叶变换的第k个点计算如下:
在这里插入图片描述
短时傅里叶变换的定义为
在这里插入图片描述

  • 短时傅里叶分析是窗选语音信号的标准傅里叶变换
  • 它有两个自变量:n,w,既是关于时间n的离散函数, 又是关于角频率w的连续函数

清/浊音加不同窗时傅里叶变换后频谱图(N=256)
代码

% 程序4.1:qingzhuoyinpinpu.m
fid=fopen('voice2.txt','rt');       %打开文件
y=fscanf(fid,'%f');             %读数据
e=fra(256,128,y);              %对y分帧,帧长256,帧移128
ee=e(10,:);                   %选取第10帧
subplot(421)                  %画第一个子图
ee1=ee/max(ee);               %幅值归一化
plot(ee1)                     %画波形
xlabel('样点数')               %横坐标名称
ylabel('幅度')                 %纵坐标名称
title ('原始语音')             %文字标注
axis([0,256,-1.5,1.5])           %限定横纵坐标范围

% 矩形窗傅立叶变换
r=fft(ee,1024);                 %对信号ee进行1024点傅立叶变换
r1=abs(r);                    %对r取绝对值 r1表示频谱的幅度值
r1=r1/max(r1);                %幅值归一化
yuanlai=20*log10(r1);          %对归一化幅值取对数
signal(1:256)=yuanlai(1:256);    %取256个点,目的是画图的时候,维数一致
pinlv=(0:1:255)*8000/512;       %点和频率的对应关系
subplot(425)                  %画第五个子图
plot(pinlv,signal);              %画幅值特性图
xlabel('f/Hz')                  %横坐标名称
ylabel('对数幅度/dB')          %纵坐标名称
title ('加矩形窗时语音谱')     %文字标注
axis([0,4000,-80,15])           %限定横纵坐标范围

%加Hamming窗
f=ee'.*hamming(length(ee));          %对选取的语音信号加Hamming窗
f1=f/max(f);                        %对加窗后的语音信号的幅值归一化
subplot(423)                       %画第三个子图
plot(f1)                           %画波形
axis([0,256,-1.5,1.5])                %限定横纵坐标范围
xlabel('样点数')                    %横坐标名称
ylabel('幅度')                      %纵坐标名称                 
title ('窗选语音')                  %文字标注

%加Hamming窗傅立叶变换
r=fft(f,1024);                      %对信号ee进行1024点傅立叶变换
r1=abs(r);                        %对r取绝对值 r1表示频谱的幅度值
r1=r1/max(r1);                    %幅值归一化
yuanlai=20*log10(r1);              %对归一化幅值取对数
signal(1:256)=yuanlai(1:256);        %取256个点,目的是画图的时候,维数一致
pinlv=(0:1:255)*8000/512;          %点和频率的对应关系
subplot(427)                      %画第七个子图
plot(pinlv,signal);                  %画幅值特性图
xlabel('f/Hz')                      %横坐标名称
ylabel('对数幅度/dB')              %纵坐标名称
title ('加Hamming窗时语音谱')    %文字标注
axis([0,4000,-80,15])               %限定横纵坐标范围

%清音的波形和短时频谱图(窗长256)
fid=fopen('qingyin1.txt','rt');          %打开文件
y=fscanf(fid,'%f');                  %读数据
e=fra(256,128,y);                   %对y分帧,帧长256,帧移128
ee=e(2,:);                         %选取第2帧
subplot(422)                       %画第二个子图
ee1=ee/max(ee);                    %幅值归一化
plot(ee1)                          %画波形
xlabel('样点数')                    %横坐标名称
ylabel('幅度')                      %纵坐标名称
title ('原始语音')                 %文字标注
axis([0,256,-1.5,1.5])                %限定横纵坐标范围

% 矩形窗傅立叶变换
r=fft(ee,1024);                      %对信号ee进行1024点傅立叶变换
r1=abs(r);                          %对r取绝对值 r1表示频谱的幅度值
r1=r1/max(r1);                      %幅值归一化
yuanlai=20*log10(r1);                 %对归一化幅值取对数
signal(1:256)=yuanlai(1:256);           %取256个点,目的是画图的时候,维数一致
pinlv=(0:1:255)*8000/512;             %点和频率的对应关系
subplot(426)                        %画第六个子图
plot(pinlv,signal);                    %画幅值特性图
xlabel('f/Hz')                        %横坐标名称
ylabel('对数幅度/dB')                 %纵坐标名称
title('加矩形窗时语音谱')           %文字标注
axis([0,4000,-80,1])                   %限定横纵坐标范围

%加Hamming窗
f=ee'.*hamming(length(ee));            %对选取的语音信号加Hamming窗
f1=f/max(f);                         %对加窗后的语音信号的幅值归一化
subplot(424)                    %画第四个子图
plot(f1)                        %画波形
axis([0,256,-1.5,1.5])             %限定横纵坐标范围
xlabel('样点数')                 %横坐标名称
ylabel('幅度')                   %纵坐标名称
title ('窗选语音')               %文字标注

%加Hamming傅立叶变换
r=fft(f,1024);                   %对信号ee进行1024点傅立叶变换
r1=abs(r);                      %对r取绝对值 r1表示频谱的幅度值
r1=r1/max(r1);                  %幅值归一化
yuanlai=20*log10(r1);            %对归一化幅值取对数
signal(1:256)=yuanlai(1:256);      %取256个点,目的是画图的时候,维数一致
pinlv=(0:1:255)*8000/512;        %点和频率的对应关系
subplot(428)                    %画第八个子图
plot(pinlv,signal);                %画幅值特性图
xlabel('f/Hz')                    %横坐标名称
ylabel('对数幅度/dB')             %纵坐标名称
title ('加Hamming窗时语音谱')  %文字标注
axis([0,4000,-80,1])               %限定横纵坐标范围fid=fopen('voice2.txt','rt');      

效果:(左侧为浊音,右侧为清音)
在这里插入图片描述

  • 可以看出浊音是有周期性的

短时功率谱
在短时傅里叶变换的基础上,可以得到短时功率谱。 短时功率谱实际上是短时傅里叶变换幅度的平方, 不难证明,它是信号x(n)的短时自相关函数的傅里 叶变换,即:
在这里插入图片描述

  • 其中,Rn(k)是自相关函数

频谱图(Spectrogram)

将语音信号连续地进行频谱分析,用时间作为横坐标频率作为纵坐标,每个像素的灰度值大小反映相应时刻和相应频率的能量(短时功率)。 其中能量功率谱具体可以表示如下:
在这里插入图片描述

  • 其中:
    • X(n,w)为傅里叶变换
      在这里插入图片描述
    • w是窗函数

例:(越红,代表能量越大)
在这里插入图片描述

窄带&宽带
在这里插入图片描述

附录

一篇不错的blog,讲解傅里叶变换:深入浅出的讲解傅里叶变换(真正的通俗易懂)

发布了138 篇原创文章 · 获赞 68 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/qq_40626497/article/details/105239644