Matlab中的音频信号处理教程

609 阅读6分钟

Matlab中的音频信号处理

信号是对物理量随时间变化的一种描述。信号处理是对信号进行操作以改变其行为或提取信息。Matlab提供了一个创建和操作离散时间信号的工具。这涉及到信号的读取和分析。它的重点是改变声音,用于音乐表现的方法,以及电信部门。

在这篇文章中,我们将讨论各种信号的滤波方法,看看图形均衡器、回声效果、变调效果和低通滤波器,后者用于去除信号中的白高斯噪声。

我们还将研究相关声音转换的频谱处理技术,这些实用知识在音乐应用的背景下用于分析、合成和描述音频信号。

低通滤波

在低通滤波中,我们假设我们的信号已经被白高斯噪声污染,它可以通过这个低通滤波器来减少。

Matlab的低通滤波器(LPF)代码

我们通过执行下面的代码将音频信号导入Matlab。

% Program to implement a LPR(FIR) with cutoff 8kHz to denoise audio signal.
[fileName, pathName] = uigetfile('*.*', 'select the input audio');
[x, Fs] = audioread(num2str(fileName)); % x is the audio samples and Fs is the sampling rate.

音频样本(x)是代表某一特定时间点上的波形值的数字。采样率(Fs)是每秒恢复的音频样本数。audioread 是一个内置的函数,用来读取输入的音频。当它被执行时,整个音频样本将被加载到变量x ,采样率将被存储在变量Fs

我们将使用的过滤器属性。

% filter implementation
Fsf = 44100;           % Sampling Frequency
Fp = 8e3;              % Passband Frequency in Hz
Fst = 8.4e3;           % stopband Frequency
Ap = 1;                % passband ribble in db
Ast = 95;              % stopband attenuation in db

然后我们设计滤波器,绕过所有的属性到设计designfilt 函数。

df = designfilt('lowpassfir', 'PassbandFrequency', Fp, 'StopbandFrequency',...
Fst, 'passbandRipple', Ap, 'stopbandAttenuation', Ast, 'sampleRate', Fsf);

一旦执行,我们将得到df ,这是过滤器对象。为了检查过滤器是否正常工作,我们使用fvtool 函数。这有助于可视化滤波器的频率响应。

fvtool(df); % visualize freq response of filter
xn = awgn(x,15,'measured'); % signal corrupted by white Gaussian noise

在上面的代码中,x 是原始信号,因为它包含输入音频的样本。为了破坏它,我们使用函数awgn 加入高斯噪声。

xn 是被破坏的信号。15是SNR比率(信噪比)。SNR是所需信息与背景噪声的比率。比值越高表示加入的噪声越少,而比值越低表示加入的噪声越多。

然后,我们使用filter 函数对噪声信号进行过滤,同时将滤波器(df)和噪声信号(xn)作为参数传给该函数。

y = filter(df, xn);

df 的输出被存储在变量y 。这些是过滤后的音频的样本。然后我们用plot函数绘制原始信号、噪声信号和过滤后的信号,如下图所示。

%plotting signals

subplot(3,1,1)
plot(x)
title('original signal')
subplot(3,1,2)
plot(xn)
title('Noisy signal')
subplot(3,1,3)
plot(y)
title('filtered signal')

当我们执行这个功能时,我们会得到过滤后的响应,也就是低通和取决于信号性质的波形。

plot of magnitude response

plot of the signals

我们可以看到输出中的噪声是如何减少的。请注意,我们不是绘制整个样本,而是用450来查看差异。波形图清楚地显示了过滤情况,但我们也可以通过听音乐来获得差异。

为了在Matlab中听音乐,我们在命令窗口中对噪声信号执行声音命令sound(xn, fs) 。我们也对过滤后的信号做同样的处理sound(y, Fs) 。在听输出的音乐时,我们注意到背景噪音明显减少。

图形均衡器

每当你在任何音频播放器上播放音乐时,你会经常发现这种类型的均衡器。它被用来产生不同的声音效果。Matlab有一个内置的函数来实现这一点。

平衡器的Matlab代码

我们首先初始化audioDeviceReader

deviceReader = audioDeviceReader('Driver', 'ALSA', 'device',...
'line In(RealtekHighDefination Audio)', 'samplesperFrame', 2048, 'SampleRate', 44100);

为了播放歌曲,我们执行audioDeviceWriter 函数。它以相同的采样率播放音乐,并使用一个均衡器工具来实现效果,如图所示。

deviceWriter = audioDeviceWriter('SampleRate', device reader.SampleRate);

equalizer = graphicEQ('Bandwidth', '1 octave', 'structure', 'parallel', 'SampleRate',...
deviceReader.SampleRate);        % we define the bandwidth which we have taken as 1 0ctave

我们把均衡器的结构看作是并行的。这意味着实现了大量的并行滤波器。行deviceReader.SampleRate ,将设备和采样率同化。然后我们指定增益。增益是均衡器滑块的位置。

equalizer.Gains = [4 4.2 4.6 2.7 -3.7 -5.2 -2.5 2.3 5.4 6.5];

为了使均衡器可视化,我们使用visualize ,如下图所示。

visualize(equalizer)
nUnderruns = 0;
tic;

然后我们用while循环来做30秒的实时工作。

while toc < 30             % 30 sec of simulation
in = deviceReader();
out = equalizer(in);
nUnderruns = nUnderruns + deviceWriter(out);
end

设备阅读器正在读取所有的输入样本,并将其存储在变量in 。然后,in 变量被传递给均衡器,输出被存储在out 变量中。然后,out 变量被deviceReader 读取,在笔记本电脑的扬声器中播放。

同化后,我们进行清理,释放所有的输入。

% clean up
release(out);
release(deviceReader)
release(deviceWriter)

回声效果

回声被添加到信号中以产生良好的效果。方程为:。

y(n) = x(n) + a.x[ n-d ] 。

'y(n)'是输出信号。'a'是增益,'d'是延迟。这里,增益指定了你需要多少深度。

Matlab的回声效果的代码

[filename, pathname] = uigetfile('*.*', 'select your audio file');
[x, Fs] = audioReader(num2str(filename));
n = length(x);          % length of the music file
a = 0.8;                % attenuation factor(gain)
d = 2000;               % Delay input stream
y = zeros((n + d),1);   % Initialize the output music signal
xn = padarray(x, [d,0], 0, 'pre');
for i = (d+1): 1: n
y(i-d,1) = x(i) + a*xn(i-d);
end

为了听音乐,我们在命令窗口中执行sound(y, Fs)

凸缘效果

凸缘效应的方程式由y(n) = x(n) + a.x[ n-d [ n ]]给出。在大的效应中,由于低频正弦波会有更多的延迟,它根据正弦波的形状而变化,如方程所示。

Matlab的法兰盘效应的代码

[filename, pathname] = uigetfile('*.*', 'select your audio file');
[x, Fs] = audioReader(num2str(filename));
n = length(x);      % length of the music
tn = n/Fs;          % finds length of music in seconds
f = 0.25;           % frequency of sine wave in Hz

我们使用linspace ,给出n个等距的点。

t = linspace(0, tn, n);
d = 100;              % Delay factor

然后我们在下面创建一个低频正弦波。延迟系数是信号通过一个点的时间,它的单位是毫秒。

modsin = sin(2*pi*f*t);

然后通过round 函数创建延迟,并绕过延迟系数和modsin的乘积。

modsin1 = round(d.*modsin') + d;               %variable delay
y = zeros(n + d, 1);           % initializing the output music signal
a = 0.5;       % attenuation factor
xn = padarray(x,[d,0], 0, 'pre');
for i = (d+1):1:n
y(i-d,1) = x(1) + a*xn(i-modsin1(i-d));
end

要听带有法兰西效果的音乐,我们在命令提示符下执行sound(y, Fs)

总结

Matlab是一个分析音频信号的好工具。它的功能使这些信号的可视化变得更加容易。正如讨论的那样,音频信号分析需要一个合适的工具来处理,Matlab就是这样的工具。

过滤音频信号是一个重要的功能,因为它可以用来保留失去的信息。这使得它在广泛的范围内适用。