- 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/
给定一个字符串"5 900 000" 我想通过以下模式使用 gsub 去除空格: gsub(/\s/, '') 但这似乎行不通。也没有: gsub(' ', '') 最佳答案 如果你想就地替换,你需要
我编写了一个程序来抓取网站以获取数据并输出到 Excel 表。该程序使用 Microsoft Visual Studio 2010 用 C# 编写。 大多数时候,我从网站获取内容、解析内容并将数据存储
在 MS Access 2007 项目报告中,我有以下(已编辑)查询: SELECT SomeCol FROM SomeTable 问题是, SomeCol 显然包含一些不可见的字符。例如,我看到一个
如 Removing left recursion 中所述,有两种方法可以去除左递归。 使用一些过程修改原始语法以删除左递归 写文法原来没有左递归 人们通常使用什么来删除(没有)ANTLR 的左递归?
我在 CoreData 中存储了一堆艺术家,并希望按名称对它们进行排序,但忽略前缀“the”。例如,“The Beatles”将被排序为“Beatles”,有点像 iTunes/iPod 的做法。 因
我有一个 WebView ,我想从中删除弹性。现在,当滚动小于 webview 的页面时,它会产生弹性效果,显示下面的背景。我想删除这个。 我尝试过执行以下操作,但没有成功。它找到了 WebDynam
我正在调查我们公司使用 Prometheus 从我们在 Kubernetes 上运行的实验中收集统计数据。有计划使用标签来标记我们的云/集群中特定实验的名称。这意味着我们将生成大量标签,这些标签会随着
我正在添加聚合物元素。我想在单击其(自己的)图像时删除元素(自我)。根据封装,我将不得不让 parent 删除 child 。但这也需要为母体生成聚合物元素(我在这里吗??)。 children.ad
现在如果我点击按钮 A,按钮 B 会显示 DropShadow 效果: Private Sub ButtonA_Click(ByVal sender As System.Object, ByVal
我尝试过这个,但它对我不起作用: char * remove_nl(char * newstr) { newstr = strdup(newstr); newstr[strlen(ne
我陷入了两难境地。我有一个图像,我想占据网页的背景。我希望它横跨屏幕的宽度和高度,并保持那个尺寸。当我使用 标签,我不知道如何将它拉伸(stretch)到没有白条的屏幕上。 wspace 和 hspa
Jade .foo .foo 结果 想要的结果 在 haml 中我会做类似 .foo>< 的事情但这在 Jade 中不起作用。我已经搜索并空手而归如何处理这个问题。我如何达到预期的结果
我是 Maven 的新手,当我尝试将我当前的项目从使用 Ant 转换为 -> 使用 Maven 时遇到了问题。 那个项目需要很多 Jar,我在 mvnrepository 上查找这些 jar 并将它们
我需要一个正则表达式来删除 xml 标记开头和结尾之间的空格。例如:有人创建 xml 并将其发送给我,这样我就可以验证、签名并发送到网络服务。 为此,我需要删除标签开头和结尾之间的空格: String
我写了几个方法来将项目添加到数组中,如果它们已经在数组中,它们将被忽略。在对数据结构做了一些研究之后,我意识到我可以通过简单地将它们放在一个集合中来摆脱重复(特别是因为我不关心对象的顺序)。然而,在玩
使用 HighCharts,我想移除 SVG 曲线上的抗锯齿。 到目前为止,我正在使用这个: $('path').each(function(i,j){$(j).attr('shape-renderi
由于某些奇怪的原因(黑色但不是黑色部分),我的 SeekBar 和拇指后面出现随机阴影。我该如何摆脱它? 我的搜索栏: 拇指.xml progress_appearance.xml(有一些
我有一个 Url,我想获取路径部分但没有尾随文件名。如果 Url 是 http://my.com/dir1/dir2/file.ext 那么我想获取 /dir1/dir2 . 我已经尝试了各种拆分(l
我有这个字符串: dataSourceURL = URL(string:"https://api.abc.com/api/p4/products?pid=uid8225&format=json&off
在我的网页中,我有一个菜单 (HorizontalPanel) 应该隐藏在页面的底部。为此,我尝试使用 RootLayoutPanel 类并在其中添加一个 south 小部件,我成功地做到了。但问
我是一名优秀的程序员,十分优秀!