一、实验目的
1. 熟悉信号的运算,包括平移与反褶、相加、相乘等;
2. 掌握在MATLAB中进行信号频谱分析的基本方法;
3. 理解信号抽样的概念和抽样定理;
4. 初步掌握在MATLAB中处理语音信号的方法。
二、实验内容
1、语音信号的获取;
2、语音信号的运算,包括平移和反褶、相加、相乘;
3、周期信号的有限项傅里叶级数合成;
4、语音信号的频谱分析;
5、连续时间信号的抽样;
6、语音信号的抽样。
三、实验步骤
1、语音信号的获取和运算
⑴ 录制语音信号并转换为wav格式,在MATLAB中读入该信号并绘制其波形;
⑵ 实现该语音信号的反褶和平移运算,输出运算后的语音信号,绘制该信号的波形;
⑶ 实现该语音信号与正弦信号的相加,输出运算后的语音信号,绘制该信号的波形;
⑷ 实现该语音信号与正弦信号的相乘,输出运算后的语音信号,绘制该信号的波形。
2、语音信号的频谱分析
⑴ 编写程序,分别绘制当N取不同值时的近似周期方波信号的波形;
⑵ 分析语音信号m(t)的频谱,绘制该频谱的波形;
⑶ 分析语音信号与正弦信号相加(m(t)+sin(2πft))的频谱,绘制该频谱的波形;
⑷ 分析语音信号与正弦信号的相乘(m(t)×sin(2πft))的频谱,绘制该频谱的波形。
3、语音信号的抽样
⑴ 对于连续的余弦信号Acos(2πft)进行抽样,抽样频率fs分别选为f、2f和4f,绘制连续余弦信号及其三种抽样信号的波形。
⑵ 对于幅度为E、宽度为τ的连续时间矩形信号(门信号)进行抽样,设f=1/τ,则抽样频率fs分别取为f、2f和4f,绘制连续门信号及其三种抽样信号的波形。
⑶ 对语音信号m(n)进行抽样得到y(n)。抽样间隔N分别取为2、4和8。分别将抽样后得到的y(n)输出为语音信号,并绘制其波形。
四、实验结果
1、语音信号的获取和运算
⑴ wavreadwavread 是 MATLAB 中的音频信号读入函数,可以将 WAV 格式的音频信号读入 MATLAB 并显示其参数。具体调用格式如下:[m,fs,bits]=wavread('E:\c\1.wav')其中,等号左端为函数的输出, m 为存储语音信号的矩阵(或列向量),fs 语音信号的采样率, bits 为比特数;‘ E:\c\1.wav’ 表示语音信号的保存路径,即语音文件 1.wav 保存在 E 盘的 c 文件夹下。注意: MATLAB2014 之后的版本使用 audioread 代替 wavread ,audioread 的具体调用格式请自行查阅资料学习。⑵ wavwritewavwrite 是 MATLAB 中的音频信号生成函数,可以将某个向量转换成 WAV 格式的音频信号并输出。具体调用格式如下:wavwrite(y,fs, bits,' E:\c\2.wav')其中, y 为需要转换为语音信号的向量, fs 语音信号的采样率, bits为比特数; ‘E:\c\2.wav’ 表示生成的语音信号的保存路径,即将向量 y转换为语音文件 2.wav ,保存在 E 盘的 c 文件夹下。注意: MATLAB2014 之后的版本使用 audiowrite 代替 wavwrite ,7 audiowrite 的具体调用格式请自行查阅资料学习。
% 本程序读取语音信号并绘制其波形,实现信号的反褶和平移,输出变换后的语音信号
clear
clear all
[m,fs]=audioread('wav录音文件路径'); %读取语音信号,wav格式
L=size(m,1); % L 为语音信号的长度
t0 = (L-1)/fs; % 语音信号的持续时间,等于总点数除以采样率
ts = 1/fs; % 语音信号时间采样间隔,等于信号抽样频率的倒数
k = [0:ts:t0]; % k 为向量 m 的时间自变量的取值范围
n = 1:L;
f=10;
f1 = m(L-n+1,1); % 实现语音信号的反褶和平移
f2=m(n)+sin(2*pi*f*k);%实现信号与正弦信号相加
f3=m(n).*sin(2*pi*f*k);%实现信号与正弦信号相乘
audiowrite('保存路径',f1,fs); % 将向量 f1 输出为语音信号 2.wav
audiowrite('保存路径',f2,fs);
audiowrite('保存路径',f3,fs);
figure(1);
plot(k,m); % 原始语音信号的波形图
title('语音的波形图'); % 标题
xlabel('时间/s'); % 横坐标
figure(2);
plot(k,f1); % 平移和反褶后语音信号的波形图
title('反褶和平移后语音的波形图');
xlabel('时间/s');
figure(3)
plot(k,f2); % 与正弦信号相加的波形图
title('与正弦信号相加的波形图');
xlabel('时间/s'); % 横坐标
figure(4)
plot(k,f3); % 与正弦信号相乘的波形图
title('与正弦信号相乘的波形图');
xlabel('时间/s'); % 横坐标
⑴ 原始语音信号的波形
⑵ 语音信号反褶和平移后的波形;
⑶ 语音信号与正弦信号相加的波形
⑷ 语音信号与正弦信号相乘的波形
2、语音信号的频谱分析
1 、实验中用到的主要函数调用格式简介⑴ fft8 fft 是 MATLAB 中进行快速傅里叶变换的函数,具体调用格式如下:X=fft(x,N)其中, x 为 N 点的离散时间信号, X 为傅里叶变换的结果,也是 N点的离散序列。⑵ fftshiftfftshift 的作用是将频谱的零频率分量平移至频谱中心。因为 fft涉及的离散傅里叶变换运算过程有圆周移位和频谱截取过程(具体原理详见“数字信号处理”课程),因此得到的频谱其中心并不对应于零频率分量。采用 fftshift 命令可以将频谱平移为正常位置。具体调用格式如下:Y=fftshift(X)其中, X 是快速傅里叶变换的结果, Y 是进行频谱平移之后的结果。
⑴% 本程序实现有限项傅里叶级数的叠加clearclear allt = -2:0.001:2; % 信号的时间取值范围E = 1; % 方波的峰峰值T = 2; % 方波的周期N = input('N='); % 输入级数的项数sn = zeros(1,length(t)); % 定义级数求和向量,初始值为零向量,长度等于时间9 长度for n=1:Nsn = sn + 2*E/pi*(1/n)*sin(n*pi/2)*cos(n*2*pi/T*t); % 傅里叶级数求和endfigure(1);plot(t,sn); % 绘制有限项傅里叶级数合成图
⑴ N取不同值时的近似周期方波信号的波形;
% 本程序实现有限项傅里叶级数的叠加
clear
clear all
t = -2:0.001:2; % 信号的时间取值范围
E = 1; % 方波的峰峰值
T = 2; % 方波的周期
N = input('N='); % 输入级数的项数
sn = zeros(1,length(t)); % 定义级数求和向量,初始值为零向量,长度等于时间长度
for n=1:N
sn = sn + 2*E/pi*(1/n)*sin(n*pi/2)*cos(n*2*pi/T*t); % 傅里叶级数求和
end
figure(1);
plot(t,sn); % 绘制有限项傅里叶级数合成图
N=6
N=66
N=666
⑵% 本程序实现语音信号的频谱分析clearclear all[m,fs,bits]=wavread('E:\c\1.wav '); % 读取语音信号L=size(m,1); % L 为语音信号的长度f = [0:(L-1)]*fs/L-fs/2; % 将信号的抽样频率和点数转换为频率值X = fft(m(:,1),L); % 原始语音信号的傅里叶变换Y = fftshift(X); % 对频谱进行平移,按正负频率对称的方式排列频谱figure(1);plot(f,abs(Y)); % 原始语音信号的幅度频谱图title(' 原始语音信号的频谱图 ');xlabel(' 频率 /Hz');
⑵ 原始语音信号的频谱
⑶ 语音信号与正弦信号相加的频谱
⑷ 语音信号与正弦信号相乘的频谱
[m,Fs]=audioread('文件路径'); %导入原始信号
[m2,Fs]=audioread('文件路径');%导入与与原始信号相加的信号
[m3,Fs]=audioread('文件路径');%导入与原始信号相乘的信号
L=size(m,1);%L为语音信号的长度
f=[0:(L-1)]*Fs/L-Fs/2;%将信号的抽样频率和点数转化为频率值
M=fft(m(:,1),L);%原始语音 信1号的傅里叶变换
MM=fftshift(M);%对频谱进行平移,按照正负对称的方式排列频谱
figure(2)
plot(f,abs(MM));%原始语音信号的幅度频谱
title('原始语音信号的频谱图');
xlabel('频率/Hz');
M2=fft(m2(:,1),L);%原始语音信号与正弦信号相加的傅里叶变换
MM2=fftshift(M2);%对频谱进行平移,按照正负对称的方式排列频谱
figure(3)
plot(f,abs(MM2));%原始语音信号与正弦信号相加的幅度频谱
title('(原始语音信号+正弦信号)的频谱图');
xlabel('频率/Hz');
M3=fft(m3(:,1),L);%原始语音信号与正弦信号相乘的傅里叶变换
MM3=fftshift(M3);%对频谱进行平移,按照正负对称的方式排列频谱
figure(4)
plot(f,abs(MM3));%原始语音信号与正弦信号相乘的幅度频谱
title('(原始语音信号*正弦信号)的频谱图');
xlabel('频率/Hz');
3、语音信号的抽样
⑴ rectpulsrectpuls 是生成连续时间矩形信号的函数,具体调用格式如下:10 11y =rectpuls( t , τ )可以生成一个幅度为 1 、宽度为 τ 、相对于 t =0 左右对称的矩形信号。2 、程序示例:⑴% 本程序实现连续时间信号的抽样clearclear allt0 = 0:0.001:0.1; % 信号持续的时间范围x0 = cos(2*pi*40*t0); % 连续余弦信号,频率为 40HzL0 = length(t0); % 信号在 MATLAB 中存储的点数Fs = 80; % 抽样频率t = 0:1/Fs:0.1; % 抽样信号的离散时间定义域和抽样间隔x = cos(2*pi*40*t); % 抽样后得到的离散余弦信号figure(1) % 在同一幅图中同时绘制连续时间信号和抽样后的离散时间信号plot(t0,x0,'r'),hold on % 绘制连续时间信号的图形stem(t,x),hold off % 绘制抽样后的离散时间信号的图形title(' 连续时间信号及其抽样信号 '); % 标题legend(' 连续时间信号 ',' 抽样信号 ',4) % 图例说明⑵% 本程序实现对语音信号的抽样,输出抽样后的语音信号clearclear all[m,fs,bits]=wavread('E:\c\1.wav '); % 读取语音信号y = m(:,1);L = size(y); % L 为离散语音信号的长度fs1 = fs/2; % 对离散信号 y 的抽样频率为原信号抽样频率的一半y1 = y(1:2:L); % 对离散信号 y, 每两个点中抽取一个点构成新的序列 y1wavwrite(y1,fs1,bits,'E:\c\cy1.wav '); % 将向量 y1 输出为语音信号 cy1.wav figure(1);plot(y1); % 抽样后语音信号的波形图title(' 抽样后的语音波形图 '); % 标题
⑴ 连续的余弦信号Acos(2πft)的抽样结果
% 本程序实现连续时间信号的抽样
clear
clear all
t0 = 0:0.001:0.1; % 信号持续的时间范围
x0 = cos(2*pi*40*t0); % 连续余弦信号,频率为 40Hz
L0 = length(t0); % 信号在 MATLAB 中存储的点数
f=80
Fs = f; % 抽样频率
t = 0:1/Fs:0.1; % 抽样信号的离散时间定义域和抽样间隔
x = cos(2*pi*40*t); % 抽样后得到的离散余弦信号
figure(1);
plot(t0,x0);%此处为t0,为连续信号
title('连续余弦信号');
figure(2) % 在同一幅图中同时绘制连续时间信号和抽样后的离散时间信号
plot(t0,x0,'r'),hold on % 绘制连续时间信号的图形
stem(t,x),hold off % 绘制抽样后的离散时间信号的图形
title('连续时间信号及其抽样信号'); % 标题
%legend('连续时间信号','抽样信号',4) % 图例说明
Fs=2*f;%抽样频率2222222222222
t=0:1/Fs:0.1;%抽样信号的离散时间定义域和抽样间隔
x=cos(2*pi*40*t);%抽样后的到的离散余弦信号
figure(3);%再同一幅图中同时绘制连续时间信号和抽样后的离散时间信号
plot(t0,x0,'g');hold on
stem(t,x,'r');%绘制抽样后的离散时间信号
title('抽样信号 抽样频率为160Hz');
Fs=4*f;%抽样频率333333333333
t=0:1/Fs:0.1;%抽样信号的离散时间定义域和抽样间隔
x=cos(2*pi*40*t);%抽样后的到的离散余弦信号
figure(4);%再同一幅图中同时绘制连续时间信号和抽样后的离散时间信号
plot(t0,x0,'g');hold on
stem(t,x,'r');%绘制抽样后的离散时间信号
title('抽样信号 抽样频率为320Hz');
① fs =f时抽样信号的波形
② fs = 2f时抽样信号的波形
③ fs = 4f时抽样信号的波形
⑵ 连续时间矩形信号(门信号)的抽样结果
① fs =f时抽样信号的波形
② fs = 2f时抽样信号的波形
③ fs = 4f时抽样信号的波形
tm=-10:0.001:10;%定义们信号的时间范围
U=rectpuls(tm,5);%产生门信号幅度为1,宽度为5的门信号
f=1/5;%定义抽样频率
figure(5);%subplot(2,2,1)
plot(tm,U);%绘制门信号连续信号
title('门信号连续信号')
t2=-10:f:10;%抽样信号的离散时间定义域和抽样间隔
U2=rectpuls(t2,5);
figure(6)%subplot(2,2,2);%绘制抽样频率为f的离散信号
stem(t2,U2);%绘制抽样后的离散时间信号
title('抽样信号 抽样频率为fHz')
t3=-10:2*f:10;%抽样信号的离散时间定义域和抽样间隔
U3=rectpuls(t3,5);
figure(7)%subplot(2,2,3);%绘制抽样频率为2f的离散信号
stem(t3,U3);%绘制抽样后的离散时间信号
title('抽样信号 抽样频率为2fHz')
t4=-10:4*f:10;%抽样信号的离散时间定义域和抽样间隔
U4=rectpuls(t4,5);
figure(8)%subplot(2,2,4);%绘制抽样频率为4f的离散信号
stem(t4,U4);%绘制抽样后的离散时间信号
title('抽样信号 抽样频率为4fHz')
⑶ 语音信号的抽样结果。抽样间隔N分别取为2、4和8。分别将抽样后得到的y(n)输出为语音信号,并绘制其波形。
① N=2时抽样信号的波形
② N=4时抽样信号的波形
③ N=8时抽样信号的波形
% 本程序实现对语音信号的抽样,输出抽样后的语音信号
clear
clear all
[m,fs]=audioread('文件路径'); %读取语音信号
y = m(:,1);
L = size(y); % L 为离散语音信号的长度
fs1 = fs/2; % 对离散信号 y 的抽样频率为原信号抽样频率的一半
y1 = y(1:2:L); % 对离散信号 y,每两个点中抽取一个点构成新的序列 y1
audiowrite('保存路径',y1,fs1); % 将向量 y1 输出为语音信号 cy1.wav
figure(1);
plot(y1); % 抽样后语音信号的波形图
title('抽样后的语音波形图'); % 标题
fs2=fs/4;% 对离散信号y的抽样频率为原信号抽样频率的1/4 存储时使用此抽样频率!!!!
y2=y(1:4:L);%对离散信号y,每4个点中取一个点构成新的序y2
audiowrite('保存路径',y2,fs2);%!!存储语音(存储信号在程序中的名字, !!fs2抽样频率)
figure(2)
plot(y2);
title('抽样间隔为4的语音信号的波形');
fs3=fs/8;% 对离散信号y的抽样频率为原信号抽样频率的一半 存储时使用此抽样频率!!!!
y3=y(1:8:L);%对离散信号y,每两个点中取一个点构成新的序y3
audiowrite('保存路径',y3,fs3);%!!存储语音(存储信号在程序中的名字, !!fs3抽样频率)
figure(3)
plot(y3);
title('抽样间隔为8的语音信号的波形');
结语,
ok,试验结束,有些我附上了实验结果,有些需要自己运行,记得修改代码。加油,宝贝们。
为了方便使用2014版本之前的同学,特附上12版本的代码以供使用。
% 本程序读取语音信号并绘制其波形,实现信号的反褶和平移,输出变换后的语音信号
clear
clear all
[m,fs,bits]=wavread('D:\FFOutput\1.wav '); %读取语音信号,wav格式
L=size(m,1); % L 为语音信号的长度
t0 = (L-1)/fs; % 语音信号的持续时间,等于总点数除以采样率
ts = 1/fs; % 语音信号时间采样间隔,等于信号抽样频率的倒数
k = [0:ts:t0]; % k 为向量 m 的时间自变量的取值范围
n = 1:L;
f=10;
f1 = m(L-n+1,1); % 实现语音信号的反褶和平移
f2=m(n)+sin(2*pi*f*k);%实现信号与正弦信号相加
f3=m(n).*sin(2*pi*f*k);%实现信号与正弦信号相乘
wavwrite(f1,fs,bits,'D:\FFOutput\3.wav'); % 将向量 f1 输出为语音信号 3.wav
wavwrite(f2,fs,bits,'D:\FFOutput\4.wav');
wavwrite(f3,fs,bits,'D:\FFOutput\5.wav');
figure(1);
plot(k,m); % 原始语音信号的波形图
title('语音的波形图'); % 标题
xlabel('时间/s'); % 横坐标
figure(2);
plot(k,f1); % 平移和反褶后语音信号的波形图
title('反褶和平移后语音的波形图');
xlabel('时间/s');
figure(3)
plot(k,f2); % 与正弦信号相加的波形图
title('与正弦信号相加的波形图');
xlabel('时间/s'); % 横坐标
figure(4)
plot(k,f3); % 与正弦信号相乘的波形图
title('与正弦信号相乘的波形图');
xlabel('时间/s'); % 横坐标
%信号实验1.2 语音信号的频谱分析
t=-2:0.001:2;
E=1;%波峰的峰值
T=2;%波博的周期
N=input('N=');%输入级数的项数
sn=zeros(1,length(t));%定义级数求和向量,长度等于时间长度
for n=1:N
sn=sn+2*E/pi*(1/n)*sin(n*pi/2)*cos(n*2*pi/T*t);%傅里叶级数求和
end
figure(1)
plot(t,sn);%绘制有限项傅里叶基数合成图
title('方波信号');
[m,Fs,bits]=wavread('D:\FFOutput\1.wav'); %导入原始信号
[m2,Fs,bits]=wavread('D:\FFOutput\1.wav');%导入与与原始信号相加的信号
[m3,Fs,bits]=wavread('D:\FFOutput\1.wav');%导入与原始信号相乘的信号
L=size(m,1);%L为语音信号的长度
f=[0:(L-1)]*Fs/L-Fs/2;%将信号的抽样频率和点数转化为频率值
M=fft(m(:,1),L);%原始语音 信1号的傅里叶变换
MM=fftshift(M);%对频谱进行平移,按照正负对称的方式排列频谱
figure(2)
plot(f,abs(MM));%原始语音信号的幅度频谱
title('原始语音信号的频谱图');
xlabel('频率/Hz');
M2=fft(m2(:,1),L);%原始语音信号与正弦信号相加的傅里叶变换
MM2=fftshift(M2);%对频谱进行平移,按照正负对称的方式排列频谱
figure(3)
plot(f,abs(MM2));%原始语音信号与正弦信号相加的幅度频谱
title('(原始语音信号+正弦信号)的频谱图');
xlabel('频率/Hz');
M3=fft(m3(:,1),L);%原始语音信号与正弦信号相乘的傅里叶变换
MM3=fftshift(M3);%对频谱进行平移,按照正负对称的方式排列频谱
figure(4)
plot(f,abs(MM3));%原始语音信号与正弦信号相乘的幅度频谱
title('(原始语音信号*正弦信号)的频谱图');
xlabel('频率/Hz');
% 本程序实现连续时间信号的抽样
clear
clear all
t0 = 0:0.001:0.1; % 信号持续的时间范围
x0 = cos(2*pi*40*t0); % 连续余弦信号,频率为 40Hz
L0 = length(t0); % 信号在 MATLAB 中存储的点数
f=80
Fs = f; % 抽样频率
t = 0:1/Fs:0.1; % 抽样信号的离散时间定义域和抽样间隔
x = cos(2*pi*40*t); % 抽样后得到的离散余弦信号
figure(1);
plot(t0,x0);%此处为t0,为连续信号
title('连续余弦信号');
figure(2) % 在同一幅图中同时绘制连续时间信号和抽样后的离散时间信号
plot(t0,x0,'r'),hold on % 绘制连续时间信号的图形
stem(t,x),hold off % 绘制抽样后的离散时间信号的图形
title('连续时间信号及其抽样信号'); % 标题
%legend('连续时间信号','抽样信号',4) % 图例说明
Fs=2*f;%抽样频率2222222222222
t=0:1/Fs:0.1;%抽样信号的离散时间定义域和抽样间隔
x=cos(2*pi*40*t);%抽样后的到的离散余弦信号
figure(3);%再同一幅图中同时绘制连续时间信号和抽样后的离散时间信号
plot(t0,x0,'g');hold on
stem(t,x,'r');%绘制抽样后的离散时间信号
title('抽样信号 抽样频率为160Hz');
Fs=4*f;%抽样频率333333333333
t=0:1/Fs:0.1;%抽样信号的离散时间定义域和抽样间隔
x=cos(2*pi*40*t);%抽样后的到的离散余弦信号
figure(4);%再同一幅图中同时绘制连续时间信号和抽样后的离散时间信号
plot(t0,x0,'g');hold on
stem(t,x,'r');%绘制抽样后的离散时间信号
title('抽样信号 抽样频率为320Hz');
tm=-10:0.001:10;%定义们信号的时间范围
U=rectpuls(tm,5);%产生门信号幅度为1,宽度为5的门信号
f=1/5;%定义抽样频率
figure(5);%subplot(2,2,1)
plot(tm,U);%绘制门信号连续信号
title('门信号连续信号')
t2=-10:f:10;%抽样信号的离散时间定义域和抽样间隔
U2=rectpuls(t2,5);
figure(6)%subplot(2,2,2);%绘制抽样频率为f的离散信号
stem(t2,U2);%绘制抽样后的离散时间信号
title('抽样信号 抽样频率为fHz')
t3=-10:2*f:10;%抽样信号的离散时间定义域和抽样间隔
U3=rectpuls(t3,5);
figure(7)%subplot(2,2,3);%绘制抽样频率为2f的离散信号
stem(t3,U3);%绘制抽样后的离散时间信号
title('抽样信号 抽样频率为2fHz')
t4=-10:4*f:10;%抽样信号的离散时间定义域和抽样间隔
U4=rectpuls(t4,5);
figure(8)%subplot(2,2,4);%绘制抽样频率为4f的离散信号
stem(t4,U4);%绘制抽样后的离散时间信号
title('抽样信号 抽样频率为4fHz')
% 本程序实现对语音信号的抽样,输出抽样后的语音信号
clear
clear all
[m,fs,bits]=wavread('D:\FFOutput\1.wav'); %读取语音信号
y = m(:,1);
L = size(y); % L 为离散语音信号的长度
fs1 = fs/2; % 对离散信号 y 的抽样频率为原信号抽样频率的一半
y1 = y(1:2:L); % 对离散信号 y,每两个点中抽取一个点构成新的序列 y1
wavwrite(y1,fs1,bits,'D:\FFOutput\1.wav'); % 将向量 y1 输出为语音信号 cy1.wav
figure(1);
plot(y1); % 抽样后语音信号的波形图
title('抽样后的语音波形图'); % 标题
fs2=fs/4;% 对离散信号y的抽样频率为原信号抽样频率的1/4 存储时使用此抽样频率!!!!
y2=y(1:4:L);%对离散信号y,每4个点中取一个点构成新的序y2
wavwrite(y2,fs2,bits,'D:\FFOutput\1.wav');%!!存储语音(存储信号在程序中的名字, !!fs2抽样频率)
figure(2)
plot(y2);
title('抽样间隔为4的语音信号的波形');
fs3=fs/8;% 对离散信号y的抽样频率为原信号抽样频率的一半 存储时使用此抽样频率!!!!
y3=y(1:8:L);%对离散信号y,每两个点中取一个点构成新的序y3
wavwrite(y3,fs3,bits,'D:\FFOutput\1.wav');%!!存储语音(存储信号在程序中的名字, !!fs3抽样频率)
figure(3)
plot(y3);
title('抽样间隔为8的语音信号的波形');