小言_互联网的博客

数字信号处理实验二:数字语音信号与频谱分析

289人阅读  评论(0)

一、实验目的

  1. 熟悉 MATLAB 编程环境和编程特点;掌握数字音频信号的读取、存储和播放方 法,以及波形绘制和标注方法。

  2. 掌握数字音频信号的频谱(包括幅度谱和相位谱)计算方法,以及幅度谱和相 位谱的主要特点。

  3. 掌握数字和弦音频信号的基本概念和生成方法;掌握时间延迟对生成数字和弦 音频信号的影响。

二、实验过程与结果

1、数字音频信号的频谱分析

(1)数字音频信号读取 MATLAB 软件提供了数字音频信号的读取函数 audioread(),利用该函数可以读取常 见格式(如 MP3、WAV 格式等)的数字语音信号(包括单声道和双声道),并以数组形 式返回音频序列值及其采样频率。

(2)数字音频信号存储: MATLAB 软件提供了数字音频信号的存储函数 audiowrite(),利用该函数可以将数字 语音信号(包括单声道和双声道)保存为常见格式(如 MP3、WAV 等)的音频文件, 注意:在保存数字语音信号时需要采样频率值。

(3)数字音频信号绘制: 数字语音信号的采样频率比较高,为了显示清晰,可以用绘制连续变量的函数 plot() 替换绘制离散序列的函数 stem();在绘制数字音频信号时需要用函数 xlabel()和 ylabel()标注横坐标和纵坐标。

(4)数字音频信号播放: MATLAB 软件提供了常见数字音频信号的播放函数audioplayer(),它的输入参数包 括数字音频信号和采样频率。另外,可以使用函数 sound()替代 audioplayer(),它的默认 采样频率值为 8192 赫兹。

2、 数字音频信号的频谱分析

(1)读取数字音频信号并绘制频谱 双声道数字音频信号文件为 Hello.wav,在 MATLAB 环境下读取前 16s 的数字音频 数据,绘制其时域波形并播放该数字音频。调用 MATLAB 提供的快速傅里叶变换 fft() 函数,计算数字音频信号的幅度谱和相位谱(使用一个声道的音频序列即可),数字频 率的转换方法见实验原理部分。

(2)翻转数字音频信号并绘制频谱 将第(1)步读取的 16s 单通道数字音频信号的时域波形翻转(下标从 0 到 N −1 转 化为从 N −1 到 0),绘制翻转后的数字音频信号;调用 MATLAB 提供的计算快速傅里 叶变换的函数 fft(),计算翻转数字音频信号的幅度谱和相位谱(使用一个声道的音频序 列即可)。 比较原始数字音频信号和翻转数字音频信号的幅度谱,比较原始数字音频信号和翻 转数字音频信号相位谱。为了使比较结果更加清晰,可以使用函数 unwrap()对相位谱进 行解缠绕处理,已获得连续的相位形式。与此同时,为了使比较结果更加清晰,可以仅 显示数字音频信号的局部频谱,如将频率范围设定为 [0,0.2π] )。

3、 数字和弦音频信号的生成

和弦是指在音程上满足特定先后关系的一组音频信号,由可以由三个或以上的相同 音频在时间轴上依次叠加得到。

(1) 读取数字音频信号并绘制频谱

数字音频信号文件为 Intro.mp3,采集频率为 Fs = 32 kHz。在 MATLAB 环境下读取 数字音频文件 Intro.mp3,并绘制前 12s 的音频波形并播放音频信号。调用计算快速傅里 叶变换 fft()函数,得到数字音频信号的幅度谱及其分贝表示形式(数字频率的转换方法 见实验原理部分)。

(2)生成数字和弦音频信号并绘制频谱 利用第(1)步读取的数字音频信号,构造出包含五个和弦分量的数字和弦音频信 号(第 k 个和弦分量是将原始音频信号延时 F k s ´ − ( 1) /10 个采样单位、对应的序列值变 为原来的 ( 1) 1/ 2 k − ,其中 k = ¼ 1, 2, ,5。绘制数字和弦音频信号的波形,并调用函数 fft() 计算数字音频信号的幅度谱,并用函数 plot()绘制幅度谱及其分贝表示形式。调整延时 时间并再次生成数字和弦音频信号,通过播放来辨别与原来的合成结果的异同。

三、结果分析与实验结论

1、读数字音频信号的频谱分析

(1) 读取数字音频信号并绘制频谱

%% 读取和储存 
clear;clc;
[y,Fs] = audioread('hello.wav');
figure(1);
plot(y);
xlabel('n');ylabel('y');
title("读取音频并绘制时域信息");
x = fft(y);
k = 0:length(x)-1;
wk = 2*pi*k/length(x);
figure(2)
subplot(3,1,1);
plot(wk,abs(x));
xlabel('w/pi');ylabel('angle(y)');
title("幅度");
subplot(3,1,2);
unwx = unwrap(angle(x));
plot(wk,unwx);
xlabel('w/pi');ylabel('angle(y)');
title("相位");
subplot(3,1,3);
plot(wk,angle(x));
suptitle("读取音频并绘制频谱");
xlabel('w/pi');ylabel('angle(y)');
title("未解缠相位");


实验结果分析:

可以发现没有解缠绕之后的图像非常的密集,这是因为解缠绕之前的相位只限制在正负π之间,会导致变化的特别快,所以显得非常地密集,解缠绕可以更好地观察相位情况。

(2) 翻转数字音频信号并绘制频谱

%% 反转分析
figure(3);
y = flip(y);
plot(y);
xlabel('n');ylabel('y');
title("读取音频反转并绘制时域信息");
x = fft(y);
k = 0:length(x)-1;
wk = 2*pi*k/length(x);
figure(4)
subplot(2,1,1);
suptitle("读取音频反转并绘制频谱");
plot(wk,abs(x));
xlabel('w/pi');ylabel('angle(y)');
title("幅度");
subplot(2,1,2);
unwx = unwrap(angle(x));
plot(wk,unwx);
xlabel('w/pi');ylabel('angle(y)');
title("相位");

实验结果分析:

明显发现反转之后的时域图和原来的时域图呈现对称关系,但是幅度图没有发现变换,因为整段信号在频率上的投影关系没有变,正的变换和逆的变换对幅度图影响不大,相位图与原来呈对称关系。

2、数字和弦音频信号的生成

(1)读取数字音频信号并绘制频谱:

%% 读取和弦
clear;clc;
[y2,Fs2]=audioread('Intro.mp3',[1,32000*12]); %采前12s的音频
audioplayer(y2,Fs2);audiowrite('work2.wav',y2,Fs2)
figure(1);plot(y2)
xlabel('n');ylabel('y2')
title('Intro原始数字音频信号')
x2=fft(y2);
n2=length(y2);k2=0:n2-1;wk2=2*pi*k2/n2;
ax2=abs(x2);
figure(2);subplot(2,1,1);plot(wk2,ax2)
xlabel('w/pi');ylabel('|y2|');title('Intro音频幅度谱')
subplot(2,1,2);plot(wk2,20*log10(ax2)) %分贝形式表示
xlabel('w/pi');ylabel('20log10|y2|');title('Intro音频幅度谱分贝形式')

(2)生成数字和弦音频信号并绘制频谱

%% 生成和弦
yy=y2;
for kk=2:5
    z=[zeros((Fs2*(kk-1)/10),1);y2];
    yy=[yy;zeros((Fs2/10),1)];
    z=z.*((1/2^(kk-1)));
    yy=yy+z;
end
figure(3);plot(yy)
xlabel('n');ylabel('ychord');title('混响后数字音频信号')
xc=fft(yy);nc=length(yy);kc=0:nc-1;wkc=2*pi*kc/nc;
axc=abs(xc);
figure(4);subplot(2,1,1);plot(wkc,axc)
xlabel('w/pi');ylabel('|xchord|')
title('Intro混响后音频幅度谱')
subplot(2,1,2);plot(wkc,20*log10(axc))
xlabel('w/pi');ylabel('20log10|xchord|')
title('Intro混响后音频幅度谱分贝形式')
yy=yy./2; %防止写入文件时被裁剪
audiowrite('chord.wav',yy,Fs2)


实验结果分析:

​可以看出由于取的和弦延迟不是很多所以变换不是特别大,但是信号变得平滑了,延迟作用于频域上就相当于整体加了一个斜率为-π/2的直线。


转载:https://blog.csdn.net/Rorschach321/article/details/117299933
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场