【精选】语音信号处理基础(四)

您所在的位置:网站首页 语音信号处理思考题答案 【精选】语音信号处理基础(四)

【精选】语音信号处理基础(四)

2023-11-10 00:09| 来源: 网络整理| 查看: 265

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

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

实验目的

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

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

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

实验原理 1.信号的叠加

两个信号X1和X2,通过短时信号的补零,使两语音信号有相同的长度,叠加信号为 X n e w = X 1 + X 2 X_{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 = − ∞ ∞ x 1 ( k ) x 2 ( n − k ) = x 1 ( n ) ∗ x 2 ( 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点取一个值,形成一个新的序列: x D ( m ) = x ( m D ) x_{D}(m)=x(m D) xD​(m)=x(mD) 其中,D为正整数。

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

内插器和抽取器作用相反,它在两个原始序列的样点之间插入I-1个值。设原始序列为x(n),则内插后的序列x_I(m)为: x 1 ( m ) = { x ( m I ) , m = 0 , ± I , ± 2 I ⋯ 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倍采样率采样后的声音


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3