matlab实现语音信号的频域分析及应用

1.语音信号本质上是非平稳信号。但我们可以假设语音信号在一个短时间内是平稳的,这样我们用稳态分析方法处理非平稳信号。应用在傅立叶分析就是短时傅立叶变换。

语音的频域分析:包括语音信号的频谱、功率谱、倒频谱、频谱包络等.

常用频域分析方法:带通滤波器组法、Fourier 变换法、同态分析、线性预测法等。

2.倒谱分析:语音信号同态处理方法是一种设法将非线性问题转化为线性问题来进行处理的方法。它能将两个信号通过乘法合成的信号,或通过卷积合成的信号分开。

这种由卷积结果求得参与卷积的各信号分量—解卷。

对语音信号进行同态分析后,将得到语音信号的倒谱参数,因此同态分析也称为倒谱分析。

3.同态信号处理的基本原理:

典型卷积同态系统由三部分组成:

特征系统D*[]、线性系统L及逆特征系统[]。

4.语音倒谱的应用

基音周期估计:浊音信号的倒谱中存在峰值,它的出现位置等于该语音段的基音周期,而清音的倒谱中不存在峰值。利用倒谱的这个特点,我们可以进行语音的清浊音判决,并且可以估计浊音的基音周期。首先计算语音的倒谱,然后在可能出现的基音周期附近寻找峰值。如果倒谱峰值超过了预先设置的门限,则输入语音判断为浊音,其峰值位置就是基音周期的估计值;反之,如果没有超出门限的峰值的话,则输入语音为清音。

5.共振峰估计

对倒谱进行滤波,取出低时间部分进行逆特征系统处理,可以得到一个平滑的对数谱函数,这个对数谱函数显示了输入语音段的共振峰结构,同时谱的峰值对应于共振峰频率。通过此对数谱进行峰值检测,就可以估计出前几个共振峰的频率和强度。对于

6.语谱图

语谱图反映了语音信号的动态频率特性,在语音分析中具有重要的实用价值。

语谱图的时间分辨率和频率分辨率是由窗函数的特性决定的。时间分辨率高,可以看出时间波形的每个周期及共振峰随时间的变化,但频率分辨率低,不足以分辨由于激励所形成的细微结构,称为宽带语谱图,而窄带语谱图正好与之相反。

宽带语谱图可以获得较高的时间分辨率,反映频谱的快速时变过程;窄带语谱图可以获得较高的频率分辨率,反映频谱的精细结构。两者相结合,可以提供两种语音特性相关的信息。语谱图上因其不同的灰度,形成不同的纹路,称之为“声纹”。

7.绘制函数如下

语谱图绘制函数specgram

调用格式: specgram(data,nfft,Fs,window,numoverlap)

Data是语音信号,nfft是fft的长度,一般取1024或者512,fs就是采样率。
window是指窗的长度,一般和nfft相同即可,numoverlap是帧重叠的长度,取1/4 * nff 就可以了。

复倒谱:cceps,实倒谱:rceps

调用格式:y= cceps(x);y= rceps(x)

8.下面是代码实现:

短时谱:(将语音信号保存为txt文件,即保存矩阵即可,----save函数)

clc;clear;
fid=fopen('mathvoice.txt', 'rt');%以文本的形式打开文件
x=fscanf(fid, '%f');
fclose(fid);
 
s1=x(12000: 40:153320);%取数组 x 的前 320 个数字
N=320;
s2=s1/max(s1);
figure(1);subplot(4,1,1);plot(s2);
xlabel('样点数');ylabel('幅值');
axis([0, 320, -1, 1]);
title('浊音原信号');
x2=enframe(s2,100,128);%分帧
ee=(x2(1,:));
 
%加Hamming窗
f=ee'.*hamming(length(ee));          %对选取的语音信号加Hamming窗
f1=f/max(f);                        %对加窗后的语音信号的幅值归一化
subplot(412)                       %画第三个子图
plot(f1)                           %画波形
%axis([0,256,-1.5,1.5])                %限定横纵坐标范围
xlabel('样点数')                    %横坐标名称
ylabel('幅度')                      %纵坐标名称                 
title ('窗选语音')                  %文字标注
 
% 矩形窗傅立叶变换
r=fft(s2,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(413)                  %画第五个子图
plot(pinlv,signal);              %画幅值特性图
xlabel('f/Hz')                  %横坐标名称
ylabel('对数幅度/dB')          %纵坐标名称
title ('加矩形窗时语音谱')     %文字标注
axis([0,4000,-80,15])           %限定横纵坐标范围
 
 
%加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(414)                      %画第七个子图
plot(pinlv,signal);                  %画幅值特性图
xlabel('f/Hz')                      %横坐标名称
ylabel('对数幅度/dB')              %纵坐标名称

倒谱图:

[s,fs,nbit]=wavread('123.wav');           %读入一段语音
b=s';                                   %将s转置
x=b(5000:5399);                         %取400点语音
N=length(x);                            %读入语音的长度
S=fft(x);                               %对x进行傅立叶变换
Sa=log(abs(S));                         %log为以e为底的对数
sa=ifft(Sa);                             %对Sa进行傅立叶逆变换
ylen=length(sa); 
for i=1:ylen/2
    sa1(i)=sa(ylen/2+1-i);
end
for i=(ylen/2+1):ylen
    sa1(i)=sa(i+1-ylen/2);
end
%绘图
figure(1);
subplot(2,1,1);
plot(x);
axis([0,400,-0.5,0.5])
title('截取的语音段');
xlabel('样点数');
ylabel('幅度');
subplot(2,1,2);
time2=[-199:1:-1,0:1:200];
plot(time2,sa1);
axis([-200,200,-0.5,0.5])
title('截取语音的倒谱');
xlabel('样点数');
ylabel('幅度');

共振峰检测:

waveFile='qinghua.wav '; 
[y, fs, nbits] = wavread(waveFile); 
time=(1:length(y))/fs; 
frameSize=floor(40*fs/1000);              % 帧长
startIndex=round(15000);                 % 起始序号
% startIndex=round(20000);                 % 起始序号
% endIndex=startIndex+frameSize-1;          % 结束序号 
endIndex=startIndex+frameSize-1;          % 结束序号 
frame = y(startIndex:endIndex);            % 取出该帧 
frameSize=length(frame);
frame2=frame.*hamming(length(frame));    % 加 hamming window 
rwy= rceps(frame2);                     % 求倒谱 
%ylen=length(rwy); 
ylen=max(size(rwy)) ;
cepstrum=rwy(1:floor(ylen/2)); 
 
%基音检测 
LF=floor(fs/500);
HF=floor(fs/70);
cn=cepstrum(LF:HF);
[mx_cep ind]=max(cn); 
 
%共振峰检测核心代码: 
% 找到最大的突起的位置 
NN=ind+LF; 
han= hamming (NN); 
cep=cepstrum(1:NN); 
ceps=cep.*han;                           % hamming window 
formant1=20*log(abs(fft(ceps))); 
formant(1:2)=formant1(1:2); 
for t=3:NN 
%--do some median filtering 
    z=formant1(t-2:t); 
    md=median(z); 
    formant2(t)=md; 
end 
for t=1:NN-1 
    if t<=2 
       formant(t)=formant1(t); 
    else
       formant(t)=formant2(t-1)*0.25+formant2(t)*0.5+formant2(t+1)*0.25;
    end 
end 
 
subplot(3,1,1); 
plot(cepstrum); 
title('倒谱'); 
xlabel('样点数');
ylabel('幅度')
axis([0,220,-0.5,0.5])
 
spectral=20*log10(abs(fft(frame2))); 
subplot(3,1,2); 
xj=(1:length(spectral)/2)*fs/length(spectral); 
 plot(xj,spectral(1:length(spectral)/2));  
title('频谱'); 
xlabel('频率/Hz');
ylabel('幅度/dB')
axis([0,5500,-100,50])
 
subplot(3,1,3); 
xi=(1:NN/2)*fs/NN; 
plot(xi,formant(1:floor(NN/2))); 
title('平滑对数幅度谱'); 
xlabel('频率/Hz');
ylabel('幅度/dB')
axis([0,5500,-80,0])

基音检测:

waveFile='beijing.wav '; 
[y, fs, nbits] = wavread(waveFile); 
time1=1:length(y); 
time=(1:length(y))/fs; 
frameSize=floor(50*fs/1000);               % 帧长
startIndex=round(5000);                   % 起始序号
endIndex=startIndex+frameSize-1;          % 结束序号 
frame = y(startIndex:endIndex);             % 取出该帧 
 
frameSize=length(frame);
frame2=frame.*hamming(length(frame));     % 加 hamming window 
rwy= rceps(frame2);                      % 求倒谱 
ylen=length(rwy); 
cepstrum=rwy(1:ylen/2); 
 
for i=1:ylen/2
    cepstrum1(i)=rwy(ylen/2+1-i);
end
for i=(ylen/2+1):ylen
    cepstrum1(i)=rwy(i+1-ylen/2);
end
 
%基音检测 
LF=floor(fs/500);                      %基音周期的范围是70Hz~500Hz
HF=floor(fs/70);
cn=cepstrum(LF:HF);
[mx_cep ind]=max(cn);
if mx_cep>0.08&ind>LF 
a= fs/(LF+ind);
else 
a=0; 
end 
pitch=a 
 
% 画图
figure(1); 
subplot(3,1,1); 
plot(time1, y); 
title('语音波形'); 
axis tight 
ylim=get(gca, 'ylim'); 
line([time1(startIndex),time1(startIndex)],ylim,'color','r');
line([time1(endIndex), time1(endIndex)],ylim,'color','r');
xlabel('样点数');
ylabel('幅度');
 
subplot(3,1,2); 
plot(frame); 
axis([0,400,-0.5,0.5])
title('一帧语音'); 
xlabel('样点数');
ylabel('幅度')
 
subplot(3,1,3); 
time2=[-199:1:-1,0:1:200];
plot(time2,cepstrum1); 
axis([-200,200,-0.5,0.5])
title('一帧语音的倒谱'); 
xlabel('样点数');
ylabel('幅度');

清浊音频谱图:

% 浊音的波形和短时频谱图(窗长256)
y=wavread('beijing.wav');
e=fra(256,128,y);              %对y分帧,帧长256,帧移128
ee=e(45,:);                   %选取第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)
y=wavread('beijing.wav');
e=fra(256,128,y);                   %对y分帧,帧长256,帧移128
ee=e(5,:);                         %选取第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');      

代码仅供参考,部分代码来源于网络,但找不到出处了。侵删

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/31573.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

mySql和VSC++

确认主机服务里的mysql服务已打开 使用组合键“winR”运行“services.msc”&#xff0c;进入本地服务窗口&#xff1b; 2.进入本地服务窗口后&#xff0c;在右侧服务列表中&#xff0c;查找到“ mysql ”服务选项&#xff1b; 3.查找到mysql服务选项后&#xff0c;双击打开mysq…

linux安装anaconda

linux安装anaconda 1、下载anaconda&#xff1a; Conda 是一个强大的包管理器和环境管理器&#xff0c;您可以在 Windows 的 Anaconda Prompt 或 macOS 或 Linux 的终端窗口中与命令行命令一起使用。 换句话说&#xff0c;我把Conda理解为前端的npm或yarn&#xff0c;后端的…

二进制部署k8集群(上)搭建单机matser和etcd集群

1. 单机matser预部署设计 组件部署&#xff1a; 2.操作系统初始化配置 注意&#xff1a;该操作在所有node节点上进行&#xff0c;为k8s集群提供适合的初始化部署环境 #关闭防火墙 systemctl stop firewalld systemctl disable firewalld iptables -F && iptables -t n…

Java-三种基本控制结构及相关面试题

文章目录 前言一、 顺序控制结构1.1 概念1.2 代码1.3 NS图中体现 二、分支控制结构2.1 概念2.2 if语句2.3 switch语句2.4 NS图中的体现 三、循环控制结构3.1 概念3.2 for循环3.3 while循环3.4 do-while循环3.5 增强 for 循环NS图中的体现 四、相关面试题什么是控制流语句&#…

从零开始:如何用Python建立你的第一个人工智能模型

1. 摘要&#xff1a; 在这篇文章中&#xff0c;我们将介绍如何从零开始使用Python建立你的第一个人工智能模型。无论你是刚接触编程的新手&#xff0c;还是有经验的开发者想进一步探索人工智能领域&#xff0c;这篇文章都将为你提供清晰、详细的指南。我们将一步步探索数据预处…

macOS Monterey 12.6.7 (21G651) Boot ISO 原版可引导镜像

macOS Monterey 12.6.7 (21G651) Boot ISO 原版可引导镜像 本站下载的 macOS 软件包&#xff0c;既可以拖拽到 Applications&#xff08;应用程序&#xff09;下直接安装&#xff0c;也可以制作启动 U 盘安装&#xff0c;或者在虚拟机中启动安装。另外也支持在 Windows 和 Lin…

2023年大学计算机专业实习心得14篇

2023年大学计算机专业实习心得精选篇1 20__年已然向我们挥手告别而去了。在20__年初之际&#xff0c;让我们对过去一年的工作做个总结。忙碌的一年里&#xff0c;在领导及各位同事的帮助下&#xff0c;我顺利的完成了20__年的工作。为了今后更好的工作&#xff0c;总结经验&…

《Java黑皮书基础篇第10版》 第17章【笔记】

第十七章 二进制I/O 17.1 引言 文件可以不严谨的分类为文本文件和二进制文件。文本文件指的是可以用文件编辑器进行查看和修改的&#xff0c;二进制文件则不可以使用文本编辑器查看和修改。 例如&#xff0c;Test.java文件储存在文本文件中&#xff0c;因此可以用文本编辑器…

Web安全测试中常见逻辑漏洞解析(实战篇)

前言&#xff1a; 越权漏洞是比较常见的漏洞类型&#xff0c;越权漏洞可以理解为&#xff0c;一个正常的用户A通常只能够对自己的一些信息进行增删改查&#xff0c;但是由于程序员的一时疏忽&#xff0c;对信息进行增删改查的时候没有进行一个判断&#xff0c;判断所需要操作的…

leetcode188. 买卖股票的最佳时机 IV.动态规划-java

买卖股票的最佳时机 IV leetcode188. 买卖股票的最佳时机 IV题目描述 动态规划代码演示 动态规划专题 leetcode188. 买卖股票的最佳时机 IV 来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 链接&#xff1a;https://leetcode.cn/problems/best-time-to-buy-and-sell-st…

从零构建后端项目-创建SpringBoot项目配置MyBatis

目录 主体介绍 创建SpringBoot项目主要步骤 配置MyBatis 整合高级功能 创建SpringBoot项目 配置Tomcat 配置MySQL数据源 配置Redis数据源 配置MongoDB数据源 运行项目&#xff0c;检测配置 配置MyBatis 创建IDEA数据库连接 生成MyBatis各种文件 配置MyBatis 配…

自然语言处理从入门到应用——静态词向量预训练模型:神经网络语言模型(Neural Network Language Model)

分类目录&#xff1a;《自然语言处理从入门到应用》总目录 《自然语言处理从入门到应用——自然语言处理的语言模型&#xff08;Language Model&#xff0c;LM&#xff09;》中介绍了语言模型的基本概念&#xff0c;以及经典的基于离散符号表示的N元语言模型&#xff08;N-gram…

【Redis基础】

Redis基础 Redis基础Note Redis基础1.初识Redis1.1.认识NoSQL1.1.1.结构化与非结构化1.1.2.关联和非关联1.1.3.查询方式1.1.4.事务1.1.5.总结 1.2.认识Redis1.3.安装Redis1.3.1.依赖库1.3.2.上传安装包并解压1.3.3.启动1.3.4.默认启动1.3.5.指定配置启动1.3.6.开机自启1.3.7.wi…

Win7系统提示Windows Defender无法扫描选定的文件解决方法

Win7 64位系统提示“Windows Defender无法扫描选定的文件”怎么办呢?使用Windows Defender扫描文件,结果弹出如下图窗口,该怎么解决呢,参考下文,一起来解决Win7系统提示“Windows Defender无法扫描选定的文件”的解决方法。 原因分析: 这是因为开启Defender扫描压…

rabbitmq第三课-RabbitMQ高级功能详解以及常用插件实战

一、选择合适的队列. 实际上是可以选择三种队列类型的&#xff0c;classic经典队列&#xff0c;Quorum仲裁队列&#xff0c;Stream流式队列。 后面这两种队列也是RabbitMQ在最近的几个大的版本中推出的新的队列类型。3.8.x推出了Quorum仲裁队列&#xff0c;3.9.x推出了Stream流…

计算机网络基础知识(九)—— 什么是TelnetS?Telnet Over TLS

文章目录 01 | TelnetS02 | OpenSSL03 | 实现思路服务器处理流程客户端处理流程 04 | 代码实现服务端代码客户端代码编译过程 & 执行结果 前面学习了什么是HTTPS协议&#xff0c;了解了HTTPS的工作原理以及具体的工作流程&#xff0c;了解了HTTP协议和HTTPS协议之间的区别。…

Elasticsearch 安装(Linux)

ElasticSearch 概念安装安装es 后台启动 & 停止启动nohup 记录pid 停止 其他启动错误max number of threads内存不足 Cannot allocate memoryfailed to obtain node locks 概念 ES是一款分布式全文搜索引擎&#xff0c;基于Lucene&#xff0c;进行了二次封装&#xff0c;更…

ElasticSearch-安装Head可视化插件

安装Head可视化插件 首先需要依赖node.js和npm环境 1 安装node.js 官方下载地址:http://nodejs.cn/download/ 下载LTS版本&#xff08;长期稳定版本&#xff09; 安装可以更改安装路径,其余的都是选择 下一步傻瓜是安装 安装成功后如下 命令测试 node -v 查看node的版本 n…

Redis 2023面试5题(二)

一、Redis key没设置过期时间却被redis主动删除了 如果一个 Redis 键没有设置过期时间&#xff0c;那么 Redis 无法判断该键是否应该自动删除。因此&#xff0c;如果一个没有设置过期时间的键被 Redis 主动删除了&#xff0c;可能是以下原因之一&#xff1a; 内存不足&#x…

【论文笔记】BEIT:BERT PRE-TRAINING OF IMAGE TRANSFORMERS

GitHub 1.介绍 1.1 挑战 视觉转换器的输入单元&#xff0c;即图像补丁&#xff0c;没有预先存在的词汇。预测遮罩面片的原始像素往往会在预训练短程依赖性和高频细节上浪费建模能力 1.2 回顾一下Bert的基本架构和流程 输入编码&#xff1a;通过tokenizer将输入的文本中的每…