iOS 怎么对声音滤波 放大

[复制链接]
查看11 | 回复0 | 2021-1-27 06:46:32 | 显示全部楼层 |阅读模式
最近在进行声音采集和实时回放的开发,参数为16位单通道,但采集到的声音比较小,而且有噪音于是在回放函数
playbackCallback(void*inRefCon,
AudioUnitRenderActionFlags*ioActionFlags,
constAudioTimeStamp*inTimeStamp,
UInt32inBusNumber,
UInt32inNumberFrames,
AudioBufferList*ioData)
中对数据流进行了放大和滤波,得到的结果是如果只滤波或放大,效果明显,同时进行滤波和放大则声音完全变成了噪音。如果只滤波,得到的声音还是太小,只放大,则声音和噪音一起放大了,求指点
高通滤波函数
-(float)HighFilter:(float)data
{
if(m_HFParam>0)//highfilter
{
HFBuf[2]=HFBuf[1];
HFBuf[1]=HFBuf[0];
HFBuf[5]=HFBuf[4];
HFBuf[4]=HFBuf[3];
HFBuf[3]=data;
HFBuf[0]=HFBuf[3]*HFA0+HFBuf[4]*HFA1+HFBuf[5]*HFA2-HFBuf[1]*HFB1-HFBuf[2]*HFB2;
returnHFBuf[0];
}
else
returndata;
}
低通滤波函数
-(float)LowFilter:(float)data
{
if(m_LFParam>0)//lowfilter
{
LFBuf[3]=LFBuf[2];
LFBuf[2]=LFBuf[1];
LFBuf[1]=LFBuf[0];
LFBuf[7]=LFBuf[6];
LFBuf[6]=LFBuf[5];
LFBuf[5]=LFBuf[4];
LFBuf[4]=data;
LFBuf[0]=LFBuf[4]*LFA0+LFBuf[5]*LFA1+LFBuf[6]*LFA2+LFBuf[7]*LFA3-LFBuf[1]*LFB1-LFBuf[2]*LFB2-LFBuf[3]*LFB3;
returnLFBuf[0];
}
else
returndata;
}
放大函数
-(void)processBuffer:(AudioBufferList*)audioBufferList
{
AudioBuffersourceBuffer=audioBufferList->mBuffers[0];
//wecheckhereiftheinputdatabytesizehaschanged
if(audioBuffer.mDataByteSize!=sourceBuffer.mDataByteSize){
//clearoldbuffer
free(audioBuffer.mData);
//assingnewbytesizeandallocatethemonmData
audioBuffer.mDataByteSize=sourceBuffer.mDataByteSize;
audioBuffer.mData=malloc(sourceBuffer.mDataByteSize);
}
/**
Herewemodifytherawdatabuffernow.
Inmyexamplethisisasimpleinputvolumegain.
iOS5hasthisonboardnow,butasexamplequitegood.
*/
SInt16*editBuffer=audioBufferList->mBuffers[0].mData;
//float*pointer=audioBufferList->mBuffers[0].mData;
for(intindex=0;indexmBuffers[0].mDataByteSize/2;index++)
{
doublesample=((double)editBuffer[index])/32767.0;
sample=[self.filterHighFilter:sample];
sample=[self.filterLowFilter:sample];
sample*=32767.0;
editBuffer[index]=(SInt16)sample;
}
//loopovereverypacket
for(intnb=0;nbmBuffers[0].mDataByteSize/2);nb++){
//wecheckifthegainhasbeenmodifiedtosaveresoures
if(gain!=0){
//weneedmoreaccuracyinourcalculationsowecalculatewithdoubles
doublegainSample=((double)editBuffer[nb])/32767.0;
/*
atthispointwemultiplywithourgainfactor
wedontmakeaadditiontopreventgenerationofsoundwherenosoundis.
nonoise
0*10=0
noiseifzero
0+10=10
*/
gainSample*=gain;
/**
oursignalrangecantbehigherorlesser-1.0/1.0
wepreventthatthesignalgotoutsideourrange
*/
gainSample=(gainSample1.0)?1.0:gainSample;
/*
Thisthinghereisalittlehelpertoshapeourincomingwave.
Thesoundgetsprettywarmandbetterandthenoiseisreducedalot.
Feelfreetooutcommentthislineandhereagain.
Youcanseeherewhathappensherehttp://silentmatt.com/javascript-function-plotter/
Copythistothecommandlineandhitenter:ploty=(1.5*x)-0.5*x*x*x
*/
gainSample=(1.5*gainSample)-0.5*gainSample*gainSample*gainSample;
//multiplythenewsignalbacktoshort
gainSample=gainSample*32767.0;
//writecalculatesamplebacktothebuffer
editBuffer[nb]=(SInt16)gainSample;
}
}
//copyincomingaudiodatatotheaudiobuffer
memcpy(audioBuffer.mData,audioBufferList->mBuffers[0].mData,audioBufferList->mBuffers[0].mDataByteSize);
}

分 -->
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行