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')
当我们执行这个功能时,我们会得到过滤后的响应,也就是低通和取决于信号性质的波形。


我们可以看到输出中的噪声是如何减少的。请注意,我们不是绘制整个样本,而是用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就是这样的工具。
过滤音频信号是一个重要的功能,因为它可以用来保留失去的信息。这使得它在广泛的范围内适用。