gpt4 book ai didi

matlab - 从 wav 文件中去除噪声,MATLAB

转载 作者:行者123 更新时间:2023-12-03 21:05:40 25 4
gpt4 key购买 nike

我只用 MATLAB 作为计算器,所以我对程序不是很熟悉。我希望好心人可以指导我,因为谷歌目前是不是 我的 friend 。

我有一个 wav文件在下面的链接中,其中有人声和背景中的一些噪音。我要消除噪音。有没有人可以告诉我如何在MATLAB中做到这一点?

https://www.dropbox.com/s/3vtd5ehjt2zfuj7/Hold.wav

最佳答案

这是一个非常不完美的解决方案,特别是因为一些噪音嵌入在与您在文件中听到的声音相同的频率范围内,但这里什么也没有。我所说的关于频谱的内容是,如果你听到声音,背景噪音的嗡嗡声非常低。这位于频谱的低频范围内,而语音具有更高的频率。因此,我们可以申请 带通过滤器以去除低噪音,捕获大部分声音,并且较高侧的任何嘈杂频率也将被取消。

以下是我所做的步骤:

  • 使用 audioread 读入音频文件.
  • 播放原始声音,这样我就可以听到使用的声音。通过创建 audioplayer 来做到这一点目的。
  • 绘制左右声道以查看时域中的声音信号......如果它提供任何线索。查看 channel ,它们似乎是相同的,因此看起来只是一个麦克风被映射到两个 channel 。
  • 我进行了傅立叶变换并看到了频率分布。
  • 使用 (4) 我算出应该在何处切断频率的粗略近似值。
  • 设计了一个带通滤波器来切断这些频率。
  • 过滤信号,然后通过构建另一个 audioplayer 来播放它目的。

  • 那我们走吧!

    第1步
    %% Read in the file
    clearvars;
    close all;
    [f,fs] = audioread('Hold.wav');
    audioread将为您读入音频文件。只需在 '' 中指定您想要的文件.另外,请确保将工作目录设置为存储此文件的位置。 clearvars, close all只是为我们清理。它关闭我们所有的窗口(如果有的话),并清除我们在 MATLAB 工作区中的所有变量。 f将是读入 MATLAB 的信号,而 fs是信号的采样频率。 f这是一个二维矩阵。第一列是左声道,第二列是右声道。通常,音频文件中的 channel 总数由通过 audioread 读入的该矩阵中的总列数表示。 .

    第2步
    %% Play original file
    pOrig = audioplayer(f,fs);
    pOrig.play;

    此步骤将允许您创建一个 audioplayer接收您读入的信号 ( f ) 的对象,采样频率为 fs并输出存储在 pOrig 中的对象.然后您使用 pOrig.play在 MATLAB 中播放文件,以便您可以听到它。

    第 3 步
    %% 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 是一种在同一个窗口中放置多个图形的方法。我不会在这里讨论它,但你可以阅读如何 subplot通过引用 this StackOverflow post I wrote here 详细工作.上面的代码产生如下图所示的图:

    signals

    上面的代码非常简单。我只是在每个子图中单独绘制每个 channel 。

    第四步
    %% 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。这称为 Nyquist frequency .您的音频文件的采样频率为 48000 Hz,这意味着您的音频文件中表示的最大频率为 24000 Hz。 fft 代表 Fast Fourier Transform .将其视为计算傅立叶变换的一种非常有效的方法。传统公式要求您对输出中的每个元素执行多次求和。 FFT 将通过需要更少的操作来有效地计算这一点,并且仍然为您提供相同的结果。

    我们正在使用 fft看看 frequency spectrum我们的信号。您拨打 fft通过指定您想要的输入信号作为第一个参数,然后是您想要使用第二个参数评估的点数。通常,您将 FFT 中的点数指定为信号的长度。我通过检查我们的声音矩阵中有多少行来做到这一点。当你绘制频谱时,我只是用一个 channel 来简化事情,因为另一个 channel 是相同的。这是 fft 的第一个输入.另外,请记住我除以 N因为这是标准化信号的正确方法。但是,因为我们只想对频域的外观进行快照,所以您实际上并不需要这样做。但是,如果您打算稍后使用它来计算某些内容,那么您肯定需要这样做。

    我写了一些额外的代码,因为频谱默认是 不居中 .我用过 fftshift 这样中心映射到 0 Hz,而左边的范围从 0 到 -24000Hz,而右边的范围从 0 到 24000 Hz。这就是我直观地看到频谱的方式。您可以将负频率视为沿相反方向传播的频率。理想情况下,负频率的频率分布应等于正频率。当您绘制频谱时,它会告诉您该频率对输出的贡献有多大。这是由 定义的震级 的信号。您可以通过 abs 找到此信息功能。您得到的输出如下所示。

    enter image description here

    如果您查看该图,会发现低频范围周围有很多尖峰。这对应于你的嗡嗡声,而声音可能映射到更高的频率范围,因为没有听到太多的声音,所以没有那么多。

    第 5 步

    通过反复试验并查看第 5 步,我认为 700 Hz 及以下的所有内容都对应于嗡嗡声,而较高的噪声贡献来自 12000 Hz 及更高。

    第 6 步

    您可以使用 butter 信号处理工具箱中的函数来帮助您设计带通滤波器。但是,如果您没有此工具箱,请参阅 this StackOverflow post关于如何实现相同功能的用户制作功能。但是,该过滤器的顺序仅为 2。假设您有 butter功能可用,您需要弄清楚您想要过滤器的顺序。订单越高,它要做的工作就越多。我选择 n = 7开始。您还需要 标准化 您的频率,以便奈奎斯特频率映射到 1,而其他所有内容都映射在 0 和 1 之间。一旦您这样做,您可以拨打 butter像这样:
    [b,a] = butter(n, [beginFreq, endFreq], 'bandpass');
    bandpass标志表示您要设计带通滤波器, beginFreqendFreq映射到您想要用于带通滤波器的标准化开始和结束频率。在我们的例子中,这是 beginFreq = 700 / NyquistendFreq = 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');

    第 7 步
    %% Filter the signal
    fOut = filter(b, a, f);

    %% Construct audioplayer object and play
    p = audioplayer(fOut, fs);
    p.play;

    您使用 filter 使用您从第 6 步中得到的信息过滤您的信号。 fOut将是您的过滤信号。如果你想听它播放,你可以构造和 audioplayer基于与输入相同采样频率的输出信号。然后您使用 p.play在 MATLAB 中听到它。

    试试这一切,看看它是如何工作的。您可能需要在第 6 步和第 7 步中玩得最多。这不是一个完美的解决方案,但足以让你开始我希望。

    祝你好运!

    关于matlab - 从 wav 文件中去除噪声,MATLAB,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24195089/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com