MATLAB - First Step in Audio Processing

MATLAB音频录制与时域频域显示

MATLAB中有各种形式的数据输入函数,其强大而全面的数据读取功能让我们可以使用函数将视频数据、音频数据读取、存储到工作区内。对于视频和音频,进行数学操作和运算后的具体效果可以很直观地被感受到,例如将视频降采样、将音频通过滤波器等。

本篇博客中,我们将使用MATLAB实现电脑音频输入,音频的频谱分析与音频的滤波。

基本内容

1.音频的录制与导入

MATLAB对音频提供了两种对象——audiorecorderaudioplayer

audiorecoder可以以特定的采样率、时长、分辨率、声道数等录制音频。在初始化好这个对象之后,使用recordrecordblocking函数均可以开始录制音频。

record使用非阻滞模式——即调用后会在继续执行之后的代码的同时进行录音。而recordblocking使用阻滞模式,在调用后到录制完成前都不会向下继续运行代码。对于record函数,可以将audiorecoder对象作为参数使用pausestop函数暂停和停止录音。

而在录音完成后,可以使用play函数和playblocking函数来播放audiorecoder对象,其播放模式和recordrecordblocking同理。

audioplayer基本参数和audiorecoder类似,但是并不具有录音的功能。

想要导入具体的音频数据到工作区,可以使用getaudiodata函数,数据将会以向量的形式存储在工作区,可以使用plot函数绘制出来。

2.音频数据的处理

将音频数据导入到工作区后,处理的过程就和普通的数据别无二致了。可以使用fft函数进行快速傅里叶变化,查看频谱信息;可以使用函数运算,在时域和频域进行变换和运算;当然,也可以使用MATLAB内置的滤波器对象和滤波器函数filter,对数据进行滤波。

在这里我们选取了fftfilter进行实验,先将原始音频数据的时域和频域绘出,经过滤波器后,再将处理过后的音频数据在时域和频域绘出。

绘制频域图像的方法在MATLAB相关教材、DSP相关教材和MATLAB官方帮助的示例中都有详细的解释,这里就不多提了。

3.FDA Tool中的滤波器设计

Filter Design&Analysis Tool 是MATLAB提供的滤波器设计与分析工具,在这个工具中,我们可以选取各种类型的FIR滤波器与IIR滤波器进行设计,并输出滤波器参数或滤波器对象到工作区或保存为MATLAB函数。在本篇中我们主要尝试对录入或读入的音频信号进行处理,所以主要需要注意的是滤波器采样率的设定,该数值一定要和你创建的audioplayeraudiorecoder中的参数对应。

具体的设计方法非常的自动化,只要调整好各项参数,如:滤波器的截止频率、通频带、增益分贝数、滤波器阶数等即可。

如果在MATLAB内部操作的话,建议将设计好的滤波器导出为MATLAB的滤波器对象,而如果想要将滤波器运用在DSPARM器件(例如使用CMSIS内核的STM32与MSP432),或其他编程语言的环境,可以将滤波器的一些系数作为数组导出。

如果不使用FDA Tool的话,也可以使用MATLAB可以直接调用的滤波器设计函数如fircls,firls,fir1,fir2等函数实现滤波器。

4.音频对象的建立与播放

将数据变化为可播放的对象十分简单,只需要利用audioplayer(data,Fs)去建立一个音频对象,并使用play去播放即可。

其中data对应单纯的音频数据,Fs对应采样率。如果两者不对应的话,可能会出现快放或者慢放的效果,当然也可以利用这个来做一些特殊的的事情。

程序流程

在本篇的程序中,将按序执行以下几件事:

  1. 44100的采样率录制5秒的音频。
  2. 绘制录入音频数据的波形与其快速傅里叶变换得到的频谱波形
  3. 将音频数据经过一个滤波器对象的处理
  4. 绘制处理后的音频数据的波形与其频谱波形
  5. 播放处理后的音频
  6. 播放原始音频

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
recObj = audiorecorder;

Fs = 44100; % sample rate
seconds = 5; % total length of audio
nBits = 16 ;
nChannels = 2 ;
ID = -1; % default audio input device
recObj = audiorecorder(Fs,nBits,nChannels,ID);

total_samples = seconds*Fs;

disp('Start speaking.')
recordblocking(recObj,seconds);
disp('End of Recording.');

data = getaudiodata(recObj);

subplot(2,2,1);
plot(data);


fftresult = fft(data);

f = linspace(0,Fs/2,total_samples/2+1);
subplot(2,2,2);
plot(f,abs(fftresult(1:total_samples/2+1)))

axis([0 5000 0 2000]) % axis of the plot should be tuned depending on data

% Design your Filter Object Hd here

FIR_data = filter(Hd,data);

t = linspace(0,seconds,total_samples);
t = [t',t'];

k = 1:total_samples;

new_audio = audioplayer(FIR_data, Fs);

fftresult_alter = abs(fft(FIR_data));

subplot(2,2,3);
plot(FIR_data);

subplot(2,2,4);
plot(f,fftresult_alter(1:total_samples/2+1))
axis([0 5000 0 2000]) % axis of the plot should be tuned depending on data

playblocking(new_audio);
play(recObj);

图片待补充——2020.11.15 by Jzjerry

参考

音频和视频 - MATLAB & Simulink - Mathworks 中国

快速傅里叶变换 - MATLAB & Simulink - Mathworks 中国

数字和模拟滤波器 - MATLAB & Simulink - Mathworks 中国

基于Matlab dsp工具箱 的实时音频采集及频谱显示 - Panda_1875的博客 - CSDN

  • Copyright: Copyright is owned by the author. For commercial reprints, please contact the author for authorization. For non-commercial reprints, please indicate the source.
  • Copyrights © 2020-2024 Jzjerry Jiang
  • Visitors: | Views:

请我喝杯咖啡吧~