语音信号处理基础(四)—语音编辑

文章目录

  • 语音信号处理基础(四)—语音编辑
    • 实验目的
    • 实验原理
      • 1.信号的叠加
      • 2.信号的卷积
      • 3.信号采样频率的变换

实验目的

1.掌握语音信号线性叠加的方法,实现非等长语音信号的叠加

2.熟悉语音信号卷积原理,实现两语音卷积。

3.熟悉语音信号升采样/降采样方法。

实验原理

1.信号的叠加

两个信号X1和X2,通过短时信号的补零,使两语音信号有相同的长度,叠加信号为
Xnew=X1+X2X_{new}=X_1+X_2 Xnew​=X1​+X2​
叠加白噪声通过生成随机信号的方法来实现

举例

在一个音频信号上叠加一个信噪比为10dB的高斯白噪声,并播放声音对比

实现代码

%语音信号叠加
clc
clear all
[x,fs]=audioread('C2_2_y.wav');
s=1:length(x);
t=s/fs;
xmax=max(abs(x));               %归一化处理
x=x/xmax;
y=awgn(x,10);        %在原始信号上叠加信噪比为10dB的高斯白噪声
ymax=max(abs(y));
y1=y/ymax;subplot(211)
plot(t,x);                      %画出原始信号的幅度谱
xlabel('时间/s');
ylabel('归一化幅值');
title('(a)原始信号');
subplot(212)
plot(t,y1);                 %画出加10dB高斯白噪声后归一化的幅度谱
xlabel('时间/s');
ylabel('归一化幅值');
title('(b)随机序列');sound(x);             %播放原始语音
pause(7);
sound(y1);            %播放加10dB高斯白噪声后的语音

运行结果

2.信号的卷积

两序列卷积的定义为
y(n)=∑k=−∞∞x1(k)x2(n−k)=x1(n)∗x2(n)y(n)=\sum_{k=-\infty}^{\infty} x_{1}(k) x_{2}(n-k)=x_{1}(n) * x_{2}(n) y(n)=k=−∞∑∞​x1​(k)x2​(n−k)=x1​(n)∗x2​(n)
注意:产生的序列y(n)长度为两序列长度之和减1

MATLAB中自带的卷积函数为conv()

语法

w=conv(u,v)

此函数将矢量u和v进行卷积运算。从代数上讲,卷积是与多项式相乘。这此多项式的系数就是u和v中的元素。

例 一个语音信号与等长的随机序列进行卷积

实现代码

%:语音信号卷积
clc
clear all
[x,fs]=audioread('C2_2_y.wav');
s=1:length(x);
t=s/fs;
xmax=max(abs(x));            %归一化
x=x/xmax;
y=randn(size(x));            %产生同x相同长度的随机序列
ymax=max(abs(y));            %归一化
y=y/ymax;
z=conv(x,y);
zmax=max(abs(z));
z=z/zmax;
t2=(1:length(z))/fs;
figure(1)
subplot(311)
plot(t,x);                   %画出原始信号
xlabel('时间/s');
ylabel('归一化幅值');
title('(a)原始信号');
subplot(312)
plot(t,y);                   %画出随机序列
xlabel('时间/s');
ylabel('归一化幅值');
title('(b)随机序列');
subplot(313)
plot(t2,z);                  %画出卷积结果
xlabel('时间/s');
ylabel('归一化幅值');
title('(c)信号卷积');

运行结果

自己编写卷积函数与上面的结果对比

实现代码

%不调用conv()函数,实现语音信号的卷积
clc
clear all
[x,fs]=audioread('C2_2_y.wav');%读取语音信号
s=1:length(x);
t=s/fs;
xmax=max(abs(x));            %归一化
x=x/xmax;
y=randn(size(x));            %产生同x相同长度的随机序列
ymax=max(abs(y));            %归一化
y=y/ymax;
z = my_conv(x,y);      %计算卷积
zmax=max(abs(z));      %归一化
z=z/zmax;
t2=(1:length(z))/fs;
subplot(311)
plot(t,x);             %画出原始信号
xlabel('时间/s');
ylabel('归一化幅值');
title('(a)原始信号');
subplot(312)
plot(t,y);             %画出随机序列
xlabel('时间/s');
ylabel('归一化幅值');
title('(b)随机序列');
subplot(313)
plot(t2,z);            %画出卷积结果
xlabel('时间/s');
ylabel('归一化幅值');
title('(c)信号卷积');function a=my_conv(b,c) %定义自卷积函数
bs=size(b);             %求b和c的大小
cs=size(c);
i=any(bs-cs);           %判断b和c的大小是否相等
if i                    %如果相等error('error')
end
i=any(~(bs-1));
if ~i                   %如果不相等error('error')
end
ko=0;
if bs(1)>bs(2)          %调整b中的元素,使其按从小到大排序,并转置b=b';c=c';ko=1;
end
bs=size(b);
cs=size(c);
ss=2*bs(2)-1;
a=zeros(1,ss);
for i=1:cs(2)           %相乘后再相加
q=zeros(1,i-1);
p=zeros(1,ss-cs(2)+1-i);
ba=[q,c,p];
ma=b(i)*ba;
a=a+ma;
end
if ko                   %如果元素排好序后,取转置a=a';
end
end

运行结果

3.信号采样频率的变换

采样率变换是多采样率信号处理的基础,主要由两个操作组成:抽取和内插。

抽取就是把原采样序列x(n)每隔D-1点取一个值,形成一个新的序列:
xD(m)=x(mD)x_{D}(m)=x(m D) xD​(m)=x(mD)
其中,D为正整数。

注:为了避免抽取序列频谱的混叠,通常需要在抽取前,将信号通过一个抗混叠滤波器。( 抗混叠滤波器是ADC之前为了消除模拟信号中频率高于奈奎斯特采样频率的信号成份,以让系统过去正确的低频信号,本质上,抗混叠滤波器是低通滤波器。)

内插器和抽取器作用相反,它在两个原始序列的样点之间插入I-1个值。设原始序列为x(n),则内插后的序列x_I(m)为:
x1(m)={x(mI),m=0,±I,±2I⋯0,others x_{1}(m)=\left\{\begin{array}{ll}{x\left(\frac{m}{I}\right),} & {m=0, \pm I, \pm 2 I \cdots} \\ {0,} & {\text { others }}\end{array}\right. x1​(m)={x(Im​),0,​m=0,±I,±2I⋯ others ​
注:内插之后还要通过低通滤波器,抑制混叠信号

MATLAB中自带函数**resample()**能实现采样率的变换

语法

y = resample(x,p,q)

-采用多相滤波器对时间序列进行重采样,得到的序列y的长度为原来的序列x的长度的p/q倍,p和q都为正整数.此时,默认采用使用FIR方法设计的抗混叠的低通滤波器.

y = resample(x,p,q,n)

采用chebyshev IIR型低通滤波器对时间序列进行重采样,滤波器的长度与n成比例,n默认值为10

例:

对简单的线性序列进行为原采样率3/2倍的重采样

实现代码

%语音信号采样频率变换
clc
clear all
[x,fs]=audioread('C2_2_y.wav');  %读取音频文件
s=1:length(x);            %采样长度
t=s/fs;                   %采样时间
xmax=max(abs(x));         %归一化处理
x=x/xmax;figure(1)
subplot(311)
axis([0 5 -1 1]);       %设定x轴与y轴的显示范围
plot(t,x);              %画出原始信号的幅度谱
xlabel('时间/s');
ylabel('归一化幅值');
title('(a)原始信号');p=2;q=1;                %设定初始值
x1=resample(x,p,q);     %采样率变换,得到的序列y的长度为原来的序列x的长度的p/q倍
x1max=max(abs(x1));     %归一化
x1=x1/x1max;
fs1=fs*p/q;             %得到原始采样频率2倍的采样频率
t1=(1:length(x1))/fs1;  %得到在新的采样频率对应的采样时间
subplot(312);
axis([0 5 -1 1]);       %设定x轴与y轴的显示范围
plot(t1,x1);            %画出2倍采样频率下的幅度谱
xlabel('时间/s');
ylabel('归一化幅值');
title('(b)2倍采样率');p=1;q=2;                 %设定初始值
x2=resample(x,p,q);      %采样率变换,得到的序列y的长度为原来的序列x的长度的p/q倍
x2max=max(abs(x2));      %归一化
x2=x2/x2max;
fs2=fs*p/q;               %得到原始采样频率1/2倍的采样频率
t2=(1:length(x2))/fs2;
subplot(313);
axis([0 5 -1 1]);         %设定x轴与y轴的显示范围
plot(t2,x2);              %画出1/2倍采样频率下的幅度谱
xlabel('时间/s');
ylabel('归一化幅值');
title('(c)1/2采样率');

运行结果

可以通过播放采集到的音频信号,分辨他们的效果

实现代码

%语音信号采样频率变换
clc
clear all
[x,fs]=audioread('C2_2_y.wav');  %读取音频文件
s=1:length(x);            %采样长度
t=s/fs;                   %采样时间
xmax=max(abs(x));         %归一化处理
x=x/xmax;p=2;q=1;                %设定初始值
x1=resample(x,p,q);     %得到的序列y的长度为原来的序列x的长度的p/q倍
x1max=max(abs(x1));     %归一化
x1=x1/x1max;
fs1=fs*p/q;             %得到原始采样频率2倍的采样频率
t1=(1:length(x1))/fs1;  %得到在新的采样频率对应的采样时间p=1;q=2;                 %设定初始值
x2=resample(x,p,q);      %得到的序列y的长度为原来的序列x的长度的p/q倍
x2max=max(abs(x2));      %归一化
x2=x2/x2max;
fs2=fs*p/q;              %得到原始采样频率1/2倍的采样频率
t2=(1:length(x2))/fs2;sound(x,fs);          %播放以初始采样率采样后的声音
pause(5)              %暂停4s,与后面的声音分开
sound(x1,fs1);        %播放以1/2倍采样率采样后的声音
pause(5)              %暂停4s,与后面的声音分开
sound(x2,fs2);        %播放以2倍采样率采样后的声音

语音信号处理基础(四)—语音编辑相关推荐

  1. python语音信号处理_现代语音信号处理笔记 (一)

    本系列笔记对胡航老师的现代语音信号处理这本书的语音处理部分进行总结,包含语音信号处理基础.语音信号分析.语音编码三部分.一开始以为三部分总结到一篇文章里就可以了,但写着写着发现事情并没有那么简单... ...

  2. 语音信号处理基础(一)

    语音信号处理基础(一) 文章目录 语音信号处理基础(一) 1.绪论 1.1概述 1.2语音信号处理的三个主要分支 1.2.1 语音合成 名词解释 共振峰 基音(fundamental tone) 基因 ...

  3. 语音信号处理基础(二)

    语音信号处理基础(二) 1.2.2 语音编码 语音编码的目的 保证在一定语音质量的前提下,尽可能降低编码比特率,以节省频率资源. 语音编码技术的鼻祖:研究开始于1939年军事保密通信的需要,贝尔电话实 ...

  4. 深度学习中的语音信号处理基础

    文章目录 音频处理流程 常用谱:幅度谱.梅尔谱 时域 --> 频域 分帧 窗长 帧移 语音信号特征获取流程 梅尔谱 使用 librosa 提取梅尔谱 使用 tacotron 获取梅尔谱(推荐) ...

  5. 【语音信号处理】1语音信号可视化——时域、频域、语谱图、MFCC详细思路与计算、差分

    基本语音信号处理操作入门 1. 数据获取 2. 语音信号可视化 2.1 时域特征 2.2 频域特征 2.3 语谱图 3. 倒谱分析 4. 梅尔系数 4.1 梅尔频率倒谱系数 4.2 Mel滤波器原理 ...

  6. 语音信号处理基础(五)——语音分帧与加窗

    文章目录 原理 1.加窗 2.分帧 一般而言语音处理的目的有两种: 一种是对语音信号进行分析,提取特征参数,用于后续处理: 提取的特征参数主要有语音的短时能量和平均幅度.短时平均过零率.短时自相关函数 ...

  7. 语音信号处理基础与MFCC

    讲道理,想要处理语音这种时间信号,最适合RNN或者SNN这种神经网络来进行识别,传统的方法是基于GMM+HMM的方式进行声学模型以及语言模型的建模.现在的语音识别往往引入神经网络,进行端到端(end- ...

  8. 语音信号处理(四):生成语音信号的语谱图

    关于语谱图的简单介绍可以参考这篇文章 现代语音信号处理之语谱图(spectrogram) 下面对 ai d s t 这四个语音进行语谱图绘制 绘制代码如下 mkdir('***');%新建存放语谱图的 ...

  9. 数字语音信号处理计算机,计算机语音信号处理与语音识别系统

    语音识别 第18卷 第5-6期 1998年12月南 京 邮 电 学 院 学 报 JournalofNanjingInstituteofPostsandTelecommunicationsVol.18 ...

最新文章

  1. 10 大流行软件测试工具
  2. 腾讯数平精准推荐 | 横扫ICDAR 2019,斩获七项冠军
  3. 外观模式 门面模式 Facade 结构型 设计模式(十三)
  4. IDEA连接服务器执行python程序
  5. 春晚红包:史上最难开卷考试,快手交卷了
  6. 视频教程-汇编语言程序设计IV-其他
  7. 基于html制作一个介绍自己家乡的网站,排版整洁,内容丰富,主题鲜明
  8. 玩转华为ENSP模拟器系列 | 配置URPF示例
  9. 开源项目9GAG源码解析与Material改造(三)
  10. (三)Detecting Spacecraft Anomalies Using LSTMs and Nonparametric Dynamic Thresholding
  11. “黎明”号新任务继续“锁定”谷神星
  12. 云服务器怎么设置成代理服务器?
  13. [4G5G专题-44]:物理层-物理层信道编码与交织加扰以及LDPC码与Polar码比较
  14. Pascal triangle 帕斯卡三角形 杨辉三角形 二项式定理
  15. form的onsubmit验证
  16. 计算机教育 专业知识,计算机教育
  17. android nfc公交,安卓手机怎么刷公交、地铁 移动NFC手机交通业务介绍
  18. 《 ThinkSNS 社区服务接口文档.md 》
  19. 字节跳动 Flink 单点恢复功能及 Regional CheckPoint 优化实践
  20. Livy:基于Apache Spark的REST服务

热门文章

  1. MySQL GUI图形化界面常用软件推荐
  2. 【NCRE】2020年9月全国计算机等级考试,计算机二级MS Office高级应用划水贴
  3. ssd raid0 linux 2018,2018-01-28 Linux学习之RAID与LVM硬盘阵列技术
  4. linux 集群服务器设置,Zookeeper集群配置
  5. 第八章节 文件操作一 (文件夹常用操作)
  6. poj 3280 区间dp
  7. android 获取网卡mac_android 获取MAC地址
  8. JAVA常用算法一:二分查找【递归 or 非递归】
  9. 3.OSPF协议及链路状态算法
  10. UnityShader18.1:立方体贴图(下)