我只将MATLAB用作计算器,因此我对该程序不太熟悉。希望有善良的人能指导我一下,因为目前谷歌并不是我的朋友。
在下面的链接中,我有一个包含人声和一些背景噪声的wav
文件。我想去除噪声。是否有人可以告诉我如何在MATLAB中完成?
我只将MATLAB用作计算器,因此我对该程序不太熟悉。希望有善良的人能指导我一下,因为目前谷歌并不是我的朋友。
在下面的链接中,我有一个包含人声和一些背景噪声的wav
文件。我想去除噪声。是否有人可以告诉我如何在MATLAB中完成?
audioread
读取音频文件。audioplayer
对象来完成此操作。audioplayer
对象来播放它。那么让我们开始吧!
%% Read in the file
clearvars;
close all;
[f,fs] = audioread('Hold.wav');
audioread
会为您读取音频文件。只需在''
中指定您想要的文件即可。还要确保您设置的工作目录是存储该文件的位置。clearvars,close all
只是为我们进行清理。它关闭了所有窗口(如果有打开的窗口),并清除了MATLAB工作区中的所有变量。f
将是读入MATLAB的信号,而fs
是您信号的采样频率。这里的f
是一个二维矩阵。第一列是左声道,第二列是右声道。通常,您音频文件中的总通道数由通过audioread
读取的此矩阵中的总列数表示。%% Play original file
pOrig = audioplayer(f,fs);
pOrig.play;
audioplayer
对象,该对象使用读取的信号(f
)和采样频率fs
,并输出存储在pOrig
中的对象。然后使用pOrig.play
在MATLAB中播放文件以便您能够听到它。%% Plot both audio channels
N = size(f,1); % Determine total number of samples in audio file
figure;
subplot(2,1,1);
stem(1:N, f(:,1));
title('Left Channel');
subplot(2,1,2);
stem(1:N, f(:,2));
title('Right Channel');
stem
是在 MATLAB 中绘制离散点的一种方法。每个时间点都有一个圆圈画在该时间点处,从水平轴到该时间点处绘制一条垂直线。subplot
是一种将多个图形放置在同一个窗口中的方法。我不会在这里详细介绍它,但您可以通过参考 这篇我写的 StackOverflow 帖子 了解 subplot
的详细工作原理。上面的代码生成下面所示的图形:
%% Plot the spectrum
df = fs / N;
w = (-(N/2):(N/2)-1)*df;
y = fft(f(:,1), N) / N; % For normalizing, but not needed for our analysis
y2 = fftshift(y);
figure;
plot(w,abs(y2));
以上代码可能看起来最令人生畏。如果您还记得信号和系统,那么在我们的信号中表示的最大频率是采样频率除以2。这被称为奈奎斯特频率。您的音频文件的采样频率为48000 Hz,这意味着您的音频文件中表示的最大频率为24000 Hz。fft
代表快速傅里叶变换。将其视为计算傅里叶变换的非常有效的方法。传统公式要求您对输出中的每个元素执行多个求和。FFT将通过要求更少的操作来高效地计算此内容,并仍然为您提供相同的结果。
fft
来查看信号的频谱。您可以通过指定要作为第一个参数的输入信号,后跟第二个参数以评估多少点来调用fft
。通常,您将FFT中的点数指定为信号的长度。我通过检查声音矩阵中有多少行来实现这一点。当您绘制频率谱时,为了简化操作,我只取了一个通道,因为另一个通道是相同的。这作为fft
的第一个输入。此外,请注意,我除以N
,因为这是规范化信号的正确方法。但是,由于我们只想拍摄频域的样片,所以您不需要这样做。但是,如果您打算稍后使用它来计算某些内容,那么您绝对需要这样做。butter
函数来帮助您设计带通滤波器。但是,如果您没有此工具箱,请参考此StackOverflow文章,了解如何使用用户制作的函数实现相同的功能。然而,该滤波器的顺序仅为2。假设您有可用的butter
函数,则需要确定您想要的滤波器顺序。顺序越高,它执行的工作就越多。我选择n = 7
作为起点。您还需要归一化您的频率,使奈奎斯特频率映射到1,而其他所有内容都映射在0到1之间。完成后,您可以这样调用butter
:[b,a] = butter(n, [beginFreq, endFreq], 'bandpass');
bandpass
标志表示您想设计一个带通滤波器,beginFreq
和endFreq
映射到您想要的带通滤波器的归一化开始和结束频率。在我们的情况下,这是beginFreq = 700 / Nyquist
和endFreq = 12000 / Nyquist
。b,a
是用于执行此任务所需的系数。您将需要这些系数进行下一步操作。
%% Design a bandpass filter that filters out between 700 to 12000 Hz
n = 7;
beginFreq = 700 / (fs/2);
endFreq = 12000 / (fs/2);
[b,a] = butter(n, [beginFreq, endFreq], 'bandpass');
%% Filter the signal
fOut = filter(b, a, f);
%% Construct audioplayer object and play
p = audioplayer(fOut, fs);
p.play;
filter
来使用第6步得到的内容对信号进行过滤。 fOut
将是您过滤后的信号。如果您想要听它播放,您可以基于此输出信号构建一个与输入相同采样频率的audioplayer
。然后在MATLAB中使用p.play
来听取它。