社区RSS源 https://community.wolfram.com Wolfram社区的RSS Feed显示按活动排序的标签信号处理中的任何讨论 [WSSA16]智能降噪 https://community.wolfram.com/groups/-/m/t/908835 ##摘要通常,由于外部噪音,通过麦克风发出的声音不太容易被理解。该项目的目标是智能地消除通过麦克风出现的噪音干扰。为了实现智能噪声消除,我们动态区分并去除"嘈杂的"声谱图中关于不同参数的区域。##引言音频文件是表示不同频率波的波'覆盖。为了得到频率范围内的结构,采用了傅里叶变换。通过傅里叶变换得到了噪声的频率特性。然后,在假设噪声幅度较小的情况下,应用一个模型,并可以使用指数截止值来消除噪声。实验表明,用一个因子对音频进行分区、应用这些更改并重新组合音频,比在原始音频上执行更改要快。最终的结果是音频数据的噪音相对较小。下面我们描述代码___检查音频是否正确并解压缩"采样率&#034"长度"和"键入"。获取音频测量[a_]:=模块[{sr,t,l,err=None},如果[!AudioQ[a],err=generateError[a]];如果[err=!=无,则返回[err]];(*提取样本率,如果提取不成功,则设置为44100)sr=音频测量[a,"采样率&#034)];如果[!IntegerQ[sr],err=generateError[a]];(*如果采样值不是整数,则它不是有效的音频*)(*提取采样率,如果提取不成功,则设置为Real32*)t=音频测量[a,"类型&#034)];如果[!MatchQ[t,supportedAudioTypes],err=generateError[a]];(*如果类型不是支持的类型之一,则它不是有效的音频*)(*提取音频长度,如果提取不成功,则返回$Failed*)l=音频测量[a,"长度&#034,];如果[!IntegerQ[l],generateError[a]];{sr,t,l}]计算窗口大小(wSize)和偏移量(getOffset)如果未给定wSize和/或getOffset,则将根据已知因素计算它们。获取窗口大小[wSize_,sr_]:=带有[{wTime=2048./44100},如果[wSize===自动,则Round[wTime*sr],wSize]]获取偏移量[wSize_,偏移Given_]:=在[{ratio=.25]的情况下,如果[offsetGiven===自动,舍入[wSize*ration],offsetGiven]]这里我们引入指数函数,它可以切断低于或高于平均频率值的频率。用共轭矩阵连接矩阵,免除了想象部分。变换后,傅里叶逆变换结果不变。但计算值的结果正在发生变化。expfunc[aa_,thresh_]:=映射[If[Abs[#]&gt=thresh,#,#*Exp[1-(thresh/(Abs[#]+0.01*thresh))^4]&,aa];separateSpectArray[array_,thresh_]:=映射[expfunc[-(thresh/(Abs[#]+0.01*thresh))^2]&,数组]在改变频谱图后,我们通过使用逆傅里叶变换返回音频数据。conjugateTwoPartsSpectArray:=编译[{数组,偏移量,win,wSize,l},模块[{res={},concat},concat=开发人员`ToPackedArray[Join[array,Take[Conjugate[Reverse[array、{2}]],All,{If[EvenQ[wSize],2,1,2],-2}],2];res=ConstantArray[0.,wSize+天花板[l]];ParallelDo[res[[1+(i-1)*offset;;(i-1,*offset+wSize]]+=Re[Inverse Fourier[concat[[i]],Fourier参数->{1,-1}]]*赢,{i,范围[长度[concat]]}]; 物件]]#使用给定函数消除噪音___去噪功能将音频文件划分为几个部分,并对每个部分应用去噪部分功能。我们的流程执行以下操作:-1.用傅里叶变换计算音频文件的频谱图-2.应用指数截止值-3.使用逆傅里叶从频谱图中获取音频文件![速度比较:处理整个数据与处理数据块][1]为了计算窗口的大小,HannWindow函数被用作默认窗口。Hann窗口的优点是锯齿非常低。汉恩函数通常用作数字信号处理中的窗口函数,用于选择样本序列子集,以便执行傅里叶变换或其他计算。$$\开始{cases}\alpha+\alpha(-\cos(2\pi x))+\cos-\压裂{1}{2}\leqx\leq\裂缝{1}{2}\\0(&);\文本{True}\结束{cases}$$去噪部件[audio_,wType_:HannWindow,wSizeGiven_:自动,offsetGiven_:自动,testFunction_:假]:=模块〔{l,sr,t,win=wType,wSize,offset,averThresh,spectArraySep,spectArraySepModify,spectArray,spectArrayModify,result〕,对于[{err=getAudioMeasurements[audio]},如果[err===$失败,返回[err],{sr,t,l}=err]];wSize=安静@getWindowSize[wSizeGiven,sr];偏移=安静@getOffset[wSize,offsetGiven];赢=安静@generateWindow[win,wSize]];然后我们使用SpectrogramArray以数组形式获取其光谱图spectArray=安静@开发者`ToPackedArray[SpectrogramArray[音频,wSize,偏移量,获胜]]然后计算参数的主平方值和平均阈值如果[!testFunction,平均阈值=安静@computeAverageThreshold[spectArray[[全部,1;;楼层[wSize/2+1]]];光谱阵列Sep=安静@separateSpectArray[spectArray[[All,1;;Floor[wSize/2+1]],averThresh];spectArraySepModify=安静@地图[#&,spectroArraySep,{2}],spectArraySepModify=spectArray[[全部,1;;楼层[wSize/2+1]]]];然后应用逆傅立叶变换从频谱图中得到音频数据spectArrayModify=安静@conjugateTwoPartsSpectArray[spectArraySepModify,offset,win,wSize,l];###最后,我们得到了结果result=开发者`ToPackedArray[Take[spectArrayModify,l]/(Total[win^2]/offset)];result=音频[result,如果[t==="Real"sr];如果[!AudioQ[result],返回[$Failed]];结果我们还使用腭化函数来实现更快的去噪过程。在实验过程中计算了一个最佳因子,它允许将音频划分为这些部分,从而使去噪过程最快。可以指定去噪函数的所有参数,尽管它以默认值的最佳方式工作。去噪[audio_,secondsInPartitions_:自动,wType_:HannWindow,wSizeGiven_:自动,offsetGiven_:自动,testFunction_:False]:=模块[{audioList,optFactor=3.9508808651665794`,optSecondsInPartitions,d,useOpt=True},如果[!AudioQ[audio],返回[$Failed]];d=音频测量[audio,"持续时间&#034)];optSecondsInPartitions=(d*1.0)/optFactor;useOpt=If[Internal`RealValuedNumericQ[secondsInPartitions]&amp&秒分区>0(&)&秒分区<d、 错误,正确];audioList=音频分区[audio,If[useOpt,optSecondsInPartitions,secondsInPartitions]];AudioTrim[AudioJoin[ParallelMap[noveroisePart[#,wType,wSizeGiven,offsetGiven和testFunction]&,音频列表]]]] 去噪[audio_,OptionsPattern[]]:=去噪[audio,OptionValue[SecondsInPartition],HannWindow,Automatic,Automatical,False][1]: http://community.wolfram.com//c/portal/getImageAttachment?filename=Capture21.PNG&用户Id=900441[2]: http://community.wolfram.com//c/portal/getImageAttachment?filename=Capture22.PNG&用户Id=900441 米纳斯·加扎里安 2016年8月19日T15:48:41 Z