- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我只用 MATLAB 作为计算器,所以我对程序不是很熟悉。我希望好心人可以指导我,因为谷歌目前是不是 我的 friend 。
我有一个 wav
文件在下面的链接中,其中有人声和背景中的一些噪音。我要消除噪音。有没有人可以告诉我如何在MATLAB中做到这一点?
https://www.dropbox.com/s/3vtd5ehjt2zfuj7/Hold.wav
最佳答案
这是一个非常不完美的解决方案,特别是因为一些噪音嵌入在与您在文件中听到的声音相同的频率范围内,但这里什么也没有。我所说的关于频谱的内容是,如果你听到声音,背景噪音的嗡嗡声非常低。这位于频谱的低频范围内,而语音具有更高的频率。因此,我们可以申请 带通过滤器以去除低噪音,捕获大部分声音,并且较高侧的任何嘈杂频率也将被取消。
以下是我所做的步骤:
audioread
读入音频文件. audioplayer
来做到这一点目的。 audioplayer
来播放它目的。 %% Read in the file
clearvars;
close all;
[f,fs] = audioread('Hold.wav');
audioread
将为您读入音频文件。只需在
''
中指定您想要的文件.另外,请确保将工作目录设置为存储此文件的位置。
clearvars, close all
只是为我们清理。它关闭我们所有的窗口(如果有的话),并清除我们在 MATLAB 工作区中的所有变量。
f
将是读入 MATLAB 的信号,而
fs
是信号的采样频率。
f
这是一个二维矩阵。第一列是左声道,第二列是右声道。通常,音频文件中的 channel 总数由通过
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
是一种在同一个窗口中放置多个图形的方法。我不会在这里讨论它,但你可以阅读如何
subplot
通过引用
this StackOverflow post I wrote here 详细工作.上面的代码产生如下图所示的图:
%% 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));
fft
代表
Fast Fourier Transform .将其视为计算傅立叶变换的一种非常有效的方法。传统公式要求您对输出中的每个元素执行多次求和。 FFT 将通过需要更少的操作来有效地计算这一点,并且仍然为您提供相同的结果。
fft
看看
frequency spectrum我们的信号。您拨打
fft
通过指定您想要的输入信号作为第一个参数,然后是您想要使用第二个参数评估的点数。通常,您将 FFT 中的点数指定为信号的长度。我通过检查我们的声音矩阵中有多少行来做到这一点。当你绘制频谱时,我只是用一个 channel 来简化事情,因为另一个 channel 是相同的。这是
fft
的第一个输入.另外,请记住我除以
N
因为这是标准化信号的正确方法。但是,因为我们只想对频域的外观进行快照,所以您实际上并不需要这样做。但是,如果您打算稍后使用它来计算某些内容,那么您肯定需要这样做。
fftshift
这样中心映射到 0 Hz,而左边的范围从 0 到 -24000Hz,而右边的范围从 0 到 24000 Hz。这就是我直观地看到频谱的方式。您可以将负频率视为沿相反方向传播的频率。理想情况下,负频率的频率分布应等于正频率。当您绘制频谱时,它会告诉您该频率对输出的贡献有多大。这是由
定义的震级 的信号。您可以通过
abs
找到此信息功能。您得到的输出如下所示。
butter
信号处理工具箱中的函数来帮助您设计带通滤波器。但是,如果您没有此工具箱,请参阅
this StackOverflow post关于如何实现相同功能的用户制作功能。但是,该过滤器的顺序仅为 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
基于与输入相同采样频率的输出信号。然后您使用
p.play
在 MATLAB 中听到它。
关于matlab - 从 wav 文件中去除噪声,MATLAB,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24195089/
在 Matlab 中,您可以选择创建新的“示例”脚本文件以及脚本、函数、类等。创建它们时,它们会获得一个脚本图标。 它们与其他标准脚本文件的处理方式有何不同? 是否有关于这些示例脚本类型的预期用途的文
我正在运行一个不是我自己编写的大 m 文件,它依赖于某些子函数。我想知道是否在所有嵌套函数的任何地方都使用了特定函数(在我的例子中是函数 eig.m(计算特征值))。有没有快速的方法来做到这一点? 亲
Matlab中有一个函数叫 copulafit .我怎样才能看到这个函数背后的代码?许多 Python 的 numpy 和 scipy 函数在 Github 上很容易开源,但由于某种原因我在 Gith
我定义了一个抽象基类measurementHandler < handle它定义了所有继承类的接口(interface)。这个类的两个子类是a < measurementHandler和 b < me
假设有一个矩阵 A = 1 3 2 4 4 2 5 8 6 1 4 9 例如,我有一个 Vector 包含该矩阵每一列的“类”
我有一个在后台运行的 Matlab 脚本。随着计算的进行,它会不断弹出进度栏窗口。这很烦人。 问题是我没有自己写 Matlab 脚本,这是一段很长很复杂的代码,我不想搞砸。那么如何在不修改 Matla
有没有办法从一个 matlab 程序中检测计算机上正在运行多少个 matlab 进程? 我想要恰好有 n 个 matlab 进程在运行。如果我的数量太少,我想创建它们,如果数量太多,我想杀死一些。您当
我正在测试我们在 Matlab 中开发的一个独立应用程序,当时我注意到它的内存使用量(根据 Windows 任务管理器)达到了 16gb 以上的数倍峰值。我决定在编译版本后面的脚本上使用 profil
我面临着一个相当棘手的问题。在 Matlab 中,命令 S = char(1044) 将俄语字母 д 放入变量 S。但是 disp(S) 返回空白符号,尽管内容实际上是正确的: >> S = char
我在这行 MATLAB 代码中遇到内存不足错误: result = (A(1:xmax,1:ymax,1:zmax) .* B(2:xmax+1,2:ymax+1,2:zmax+1) +
我正在寻找一种在 MATLAB 中比较有限顺序数据与非确定性顺序的方法。基本上,我想要的是一个数组,但不对包含的元素强加顺序。如果我有对象 a = [x y z]; 和 b = [x z y]; 我希
我有一个由 1 和 0 组成的二维矩阵。 mat = [0 0 0 0 1 1 1 0 0 1 1 1 1 1 0 0 1 0 0 0 1 0 1 1 0 0 1]; 我需
我可以在 Matlab 中用一组 x,y 点绘制回归线。但是,如果我有一组点(如下图),假设我有四组点,我想为它们绘制四条回归线……我该怎么做?所有的点都保存在 x,y 中。没有办法将它们分开并将它们
我正在尝试使用以下代码在 MATLAB 中绘制圆锥体。但是,当 MATLAB 生成绘图时,曲面中有一个间隙,如下图所示。谁能建议关闭它的方法? clearvars; close all; clc; [
我有一个 map称为 res_Map,包含一组不同大小的数组。我想找到用于存储 res_Map 的总内存。 正如您在下面看到的,看起来 res_Map 几乎不占用内存,而 res_Map 中的各个元素
有没有办法在 MATLAB 中组合 2 个向量,这样: mat = zeros(length(C),length(S)); for j=1:length(C) mat(j,:)=C(j)*S;
已结束。此问题不符合 Stack Overflow guidelines 。它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答它。 关闭 5 年前
我正在尝试将MatLab中的t copula适配到我的数据,并且我的功能是: u = ksdensity(range_1, range_1,'function','cdf'); v = ksdens
大家好,我目前正在尝试使用论文“多尺度形态学图像简化”中的 SMMT 运算符 Dorini .由于没有订阅无法访问该页面,因此我将相关详细信息发布在这里: 请注意,我将相关文章的部分内容作为图片发布。
我在MATLAB中编写代码,需要使用一个名为modwt的函数,该函数同时存在于两个我同时使用的工具箱(Wavelet和WMTSA)中。问题在于,一个版本仅返回一个输出,而另一个版本则返回三个输出。我应
我是一名优秀的程序员,十分优秀!