目录
加性噪声:加性噪声和信号直接不相关,满足加性条件。由噪声和源信号相加得到的。 种类按照声源,比如风声、汽笛声、键盘敲击声等。
乘性噪声:噪声和信号是相关联的,比如房间的混响、信号的衰减、开普勒效应等。并且往往是从信道传输中产生,也叫信号噪声。
从降噪的角度,按照噪声是否稳定。
稳态噪声:一直存在且响度、频率分布等特性不随时间变化或变化缓慢。 如手机、电脑之类的设备底噪、电脑散热架的风扇声等。
非稳态噪声:这些噪声等统计特性随时间变化 比如开关门等声音、门铃声、背景人声等。 非稳态噪声按照是否连续又分为 连续非稳态噪声(持续的背景人声)和瞬态噪声(敲击声)。
如下图,左稳态噪声右为非稳态噪声:

稳态噪声可以通过之前出现过的噪声进行建模抑制。非稳态噪声则是通过区分和正常语音的差异。另外噪声往往不是单独存在。
【频段降噪、硬件】
线性滤波器处理方法算力要求较低,但需知道噪声会在哪个频段出现。 实际中会先做噪声出现的频段检测,再设计线性滤波器或滤波器组来消除噪声。
常见于音频采集硬件中,因为硬件厂商知道自己的硬件噪声特性。如电路设计中有些频段会有持续的电流声,则可以采用比如高通滤波器消除滴频噪声、用一些陷波滤波器消除某些频段的持续噪声。
【非人声、减噪声谱、幅度谱减法、功率谱减法】
核心是先取一段非人声音频,记录下噪声的频谱能量,然后从音频频谱中减去这个噪声频谱能量。 适用于离线稳态噪声的降噪处理。
用统计的方法估算出音频每个频点对应噪声和语言的能量。 (适用于相对平稳噪声)
采用最小均方误差准则设计的线性滤波器。
如实时频域维纳滤波器,目标是求当前帧每个频点的能量中有多少占比是语音。 只能通过后验的带噪信号 与 噪声的信噪比 估计前验的语音和含噪信号比值。
3.3.1维纳滤波的降噪原理:
从动态平滑的噪声模型得到噪声,根据带噪信号和噪声模型经过维纳滤波器进行降噪。

3.3.2 流程:
3.3.3 分位数噪声估计与维纳滤波降噪的特点
分位数噪声估计与维纳滤波的降噪算法逻辑背后的思考:
3.3.4 Speech Probability的计算流程:

语音概率通过三个指标的加权平均和似然因子进行更新。 实际更新zhong 概率较大时,噪声模型更新很缓慢,因为语音存在的概率大,反之更新快。
噪声模型是通过分位数据噪声估计得到。 比如有经验假设在噪声能量谱里,能量最小的1/4是稳态噪声。应该用这个部分更新初始噪声模型。
利用初始的噪声模型可以得到频谱平坦度、频谱差异度以及对数似然因子,进而得到语音存在概率。 有了语音存在概率就可以更新噪声模型。 再根据噪声模型和带噪信号,根据加性假设。干净语谱是通过带噪信号减去 噪声信号 或带噪信号乘。频谱增益。
OMLSA:是对人声估计,通过先验概率和先验信噪比SNR的估计 得到有声条件概率。
IMCRA:是对信号的最小值追踪,同样得到先验无声概率和先验信噪比估计,计算 条件有声概率,进而获取噪声谱的估计。
两者结合是对功率谱的最小点进行追踪。所以谐波中的音乐噪声由于明显小于谐波的能量就可以被去除,可以有效去除音乐噪声。
【NMF、耳机风噪、单独建模】
子空间算法重要是针对已知的噪声类型,量身定做一个降噪算法。 把噪声和人声投影到高纬度的空间,把不容易分离的信号变成高纬度可分的子空间,从而可分的信号。
NMF(非负矩阵分离)和字典法建模等
比如去除风噪,可以对风噪建模,可以有效去噪。但缺点很明显,每种噪声都得单独建模。
基于数据驱动的方法,训练神经网络进行降噪。 特点是噪声鲁棒性好,能兼顾稳态、非稳态和瞬态噪声。 见下一讲
【麦克风阵列定向增强+单通道降噪】
结合基于麦克风阵列的降噪: 采集信号用麦克风阵列,可以使用波束形成的方法先锁定声源方向进行收音,比如说话人的方向进行收音,这样采集的信号信噪比更高,再通过单通道降噪可以更有效。
参考文献:
WIP: https://patentimages.storage.googleapis.com/a4/d9/d6/f3e557a291b982/WO2012158156A1.pdf

我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div
总的来说,我对ruby还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用
类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc
我正在尝试设置一个puppet节点,但rubygems似乎不正常。如果我通过它自己的二进制文件(/usr/lib/ruby/gems/1.8/gems/facter-1.5.8/bin/facter)在cli上运行facter,它工作正常,但如果我通过由rubygems(/usr/bin/facter)安装的二进制文件,它抛出:/usr/lib/ruby/1.8/facter/uptime.rb:11:undefinedmethod`get_uptime'forFacter::Util::Uptime:Module(NoMethodError)from/usr/lib/ruby
我想了解Ruby方法methods()是如何工作的。我尝试使用“ruby方法”在Google上搜索,但这不是我需要的。我也看过ruby-doc.org,但我没有找到这种方法。你能详细解释一下它是如何工作的或者给我一个链接吗?更新我用methods()方法做了实验,得到了这样的结果:'labrat'代码classFirstdeffirst_instance_mymethodenddefself.first_class_mymethodendendclassSecond使用类#returnsavailablemethodslistforclassandancestorsputsSeco
我在我的项目中添加了一个系统来重置用户密码并通过电子邮件将密码发送给他,以防他忘记密码。昨天它运行良好(当我实现它时)。当我今天尝试启动服务器时,出现以下错误。=>BootingWEBrick=>Rails3.2.1applicationstartingindevelopmentonhttp://0.0.0.0:3000=>Callwith-dtodetach=>Ctrl-CtoshutdownserverExiting/Users/vinayshenoy/.rvm/gems/ruby-1.9.3-p0/gems/actionmailer-3.2.1/lib/action_mailer
设置:狂欢ruby1.9.2高线(1.6.13)描述:我已经相当习惯在其他一些项目中使用highline,但已经有几个月没有使用它了。现在,在Ruby1.9.2上全新安装时,它似乎不允许在同一行回答提示。所以以前我会看到类似的东西:require"highline/import"ask"Whatisyourfavoritecolor?"并得到:Whatisyourfavoritecolor?|现在我看到类似的东西:Whatisyourfavoritecolor?|竖线(|)符号是我的终端光标。知道为什么会发生这种变化吗? 最佳答案
我已经从我的命令行中获得了一切,所以我可以运行rubymyfile并且它可以正常工作。但是当我尝试从sublime中运行它时,我得到了undefinedmethod`require_relative'formain:Object有人知道我的sublime设置中缺少什么吗?我正在使用OSX并安装了rvm。 最佳答案 或者,您可以只使用“require”,它应该可以正常工作。我认为“require_relative”仅适用于ruby1.9+ 关于ruby-主要:Objectwhenrun
我有一个具有一些属性的模型:attr1、attr2和attr3。我需要在不执行回调和验证的情况下更新此属性。我找到了update_column方法,但我想同时更新三个属性。我需要这样的东西:update_columns({attr1:val1,attr2:val2,attr3:val3})代替update_column(attr1,val1)update_column(attr2,val2)update_column(attr3,val3) 最佳答案 您可以使用update_columns(attr1:val1,attr2:val2
我不确定传递给方法的对象的类型是否正确。我可能会将一个字符串传递给一个只能处理整数的函数。某种运行时保证怎么样?我看不到比以下更好的选择:defsomeFixNumMangler(input)raise"wrongtype:integerrequired"unlessinput.class==FixNumother_stuffend有更好的选择吗? 最佳答案 使用Kernel#Integer在使用之前转换输入的方法。当无法以任何合理的方式将输入转换为整数时,它将引发ArgumentError。defmy_method(number)