Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/116.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何在核心音频中实现数字滤波器?_Ios_Objective C_Filter_Signal Processing_Audiounit - Fatal编程技术网

Ios 如何在核心音频中实现数字滤波器?

Ios 如何在核心音频中实现数字滤波器?,ios,objective-c,filter,signal-processing,audiounit,Ios,Objective C,Filter,Signal Processing,Audiounit,我有一个关于CoreAudio中数字滤波器的实现的问题。我遇到了很大的麻烦,因为这是几周我试图了解如何实现它们。其基本思想是:当我与iPhone的麦克风通话时,我的声音会被低通滤波器、高通滤波器或带通滤波器过滤 我学习了CoreAudio实现的书籍“Learning Core Audio”(虽然我不得不工作几周并进行研究,但现在工作得很好)和书籍“数字信号处理”(非常有名,因为我看到他总是在专门讨论滤波器的讨论中指出) 我理解这一点:我必须创建一个滤波器,一种内核滤波器,它是一种应用于信号本身的

我有一个关于CoreAudio中数字滤波器的实现的问题。我遇到了很大的麻烦,因为这是几周我试图了解如何实现它们。其基本思想是:当我与iPhone的麦克风通话时,我的声音会被低通滤波器、高通滤波器或带通滤波器过滤

我学习了CoreAudio实现的书籍“Learning Core Audio”(虽然我不得不工作几周并进行研究,但现在工作得很好)和书籍“数字信号处理”(非常有名,因为我看到他总是在专门讨论滤波器的讨论中指出)

我理解这一点:我必须创建一个滤波器,一种内核滤波器,它是一种应用于信号本身的“掩码”。在这种状态下,滤波器被称为“脉冲响应”或也被称为IIR。现在,我通过一个函数卷积将掩模应用于信号,成为FIR滤波器。我写的是对的吗

我试图实现所编写的内容,甚至以音频图应用程序示例作为文档,但什么都没有。不起作用

我还发现了一个文档,它以一种简单的方式解释了该做什么(名称是“在C++中创建FIR滤波器”),其中提到了滤波器的算法,但即使在这里,一旦实现,也没有起作用

因为这让我产生了疑问:也许我得到的信号与其他事情有关?我唯一能理解的是我必须把信号转换成Sint16。是的,但是后来呢?我应该如何实现数字滤波器

为此我请求帮助。我没有人可以面对,所以现在我要失明了。我给你们留下我目前的CoreAudio代码,我的工作非常完美,即使是在设备上,但是,也许是一些错误的设置

    AudioComponentDescription AudioCompDesc;
    AudioCompDesc.componentType = kAudioUnitType_Output;
    AudioCompDesc.componentSubType = kAudioUnitSubType_RemoteIO;
    AudioCompDesc.componentManufacturer = kAudioUnitManufacturer_Apple;
    AudioCompDesc.componentFlags = 0;
    AudioCompDesc.componentFlagsMask = 0;

    AudioComponent RIOComponente = AudioComponentFindNext(NULL, &AudioCompDesc);
    CheckError(AudioComponentInstanceNew(RIOComponente, &strutturaAscolto.RIO), "Impossibile ottenre un'istanza dell'unità RIO");



    UInt32 oneFlag = 1;
    AudioUnitElement bus0 = 0;
    CheckError(AudioUnitSetProperty (strutturaAscolto.RIO, kAudioOutputUnitProperty_EnableIO, kAudioUnitScope_Output,bus0, &oneFlag, sizeof(oneFlag)), "Impossibile abilitare l'uscita RIO");

    AudioUnitElement bus1 = 1;
    CheckError(AudioUnitSetProperty(strutturaAscolto.RIO, kAudioOutputUnitProperty_EnableIO, kAudioUnitScope_Input, bus1, &oneFlag, sizeof(oneFlag)),"Imposibile abilitare l'ingresso RIO");



    strutturaAscolto.AudioAscoltoASBD.mSampleRate = 44100;
    strutturaAscolto.AudioAscoltoASBD.mFormatID = kAudioFormatLinearPCM;
    strutturaAscolto.AudioAscoltoASBD.mFormatFlags = kAudioFormatFlagIsSignedInteger | kAudioFormatFlagsNativeEndian | kLinearPCMFormatFlagIsPacked;
    strutturaAscolto.AudioAscoltoASBD.mBytesPerPacket = 4;
    strutturaAscolto.AudioAscoltoASBD.mFramesPerPacket = 1;
    strutturaAscolto.AudioAscoltoASBD.mBytesPerFrame = 4;
    strutturaAscolto.AudioAscoltoASBD.mChannelsPerFrame = 2;
    strutturaAscolto.AudioAscoltoASBD.mBitsPerChannel = 16;


    CheckError(AudioUnitSetProperty (strutturaAscolto.RIO, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Input, bus0, &strutturaAscolto.AudioAscoltoASBD, sizeof (strutturaAscolto.AudioAscoltoASBD)), "Impossibile impostare la descrizione audio (ASBD) per RIO sull'applicazione di ingresso 0");

    CheckError(AudioUnitSetProperty (strutturaAscolto.RIO, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Output, bus1, &strutturaAscolto.AudioAscoltoASBD, sizeof (strutturaAscolto.AudioAscoltoASBD)), "Impossibile impostare la descrizione audio (ASBD) per RIO sull'applicazione di uscita 1");



    strutturaAscolto.SenoFrequenza = 30;
    strutturaAscolto.SenoFase = 0;

    AURenderCallbackStruct CallbackStruct;
    CallbackStruct.inputProc = ModulazioneAudio;
    CallbackStruct.inputProcRefCon = &strutturaAscolto;
    CheckError(AudioUnitSetProperty(strutturaAscolto.RIO, kAudioUnitProperty_SetRenderCallback, kAudioUnitScope_Global, bus0, &CallbackStruct, sizeof (CallbackStruct)), "Impossibile impostare il rendering di callback di RIO sul bus 0");

    CheckError(AudioUnitInitialize(strutturaAscolto.RIO), "Non è stato possibile inizializzare l'unità RIO");
    CheckError(AudioOutputUnitStart(strutturaAscolto.RIO), "Non è stato possibile avviare l'unità RIO");
而应容纳过滤器的功能仅此而已

static OSStatus ModulazioneAudio(void *inRefCon, AudioUnitRenderActionFlags *ioActionFlags, const AudioTimeStamp *inTimeStamp, UInt32 inBusNumber, UInt32 inNumberFrames,AudioBufferList *ioData) {

StrutturaAscolto *strutturaAscolto = (StrutturaAscolto*) inRefCon;


UInt32 bus1 = 1;
CheckError(AudioUnitRender(strutturaAscolto->RIO, ioActionFlags, inTimeStamp, bus1, inNumberFrames, ioData), "Non è stato possibile fare il render dell'unità RIO");

return noErr;
}
我留下一些过滤器,我测试的(不是全部)。将此算法用于文档“在C++中创建FIR滤波器”中的高通滤波器:

这是我通过阅读DPS(第16章)一书做到的,在应用听力图中也提到了这一点

void lowPassWindowedSincFilter( float *buf , float fc ) {

int i;
int m = 100;
float sum = 0;


for( i = 0; i < 101 ; i++ ) {
    if((i - m / 2) == 0 ) {
        buf[i] = 2 * M_PI * fc;
    }
    else {
        buf[i] = sin(2 * M_PI * fc * (i - m / 2)) / (i - m / 2);
    }
    buf[i] = buf[i] * (.54 - .46 * cos(2 * M_PI * i / m ));
}


for ( i = 0 ; i < 101 ; i++ ) {
    sum = sum + buf[i];
}

for ( i = 0 ; i < 101 ; i++ ) {
    buf[i] = buf[i] / sum;
}
}
void lowPassWindowedSincFilter(浮点*buf,浮点fc){
int i;
int m=100;
浮点数和=0;
对于(i=0;i<101;i++){
如果((i-m/2)==0){
buf[i]=2*M_PI*fc;
}
否则{
buf[i]=sin(2*M_PI*fc*(i-M/2))/(i-M/2);
}
buf[i]=buf[i]*(.54-.46*cos(2*M_PI*i/M));
}
对于(i=0;i<101;i++){
总和=总和+buf[i];
}
对于(i=0;i<101;i++){
buf[i]=buf[i]/和;
}
}
至于卷积函数,我用过Hamming,非常简单,我在StackOverflow上找到了

for (int i = 0; i < 1024; i++) {
    double multiplier = 0.5 * (1 - cos(2*M_PI*i/1023));
    dataOut[i] = multiplier * dataIn[i];
}
for(int i=0;i<1024;i++){
双乘数=0.5*(1-cos(2*M_PI*i/1023));
dataOut[i]=乘数*dataIn[i];
}

谢谢您的关注。

以前从未使用过,但我会调查。您好,谢谢您回复我。我看到有人建议我使用第三方工具包。我看到了你链接的网站,看起来很有趣。但我会避免这样做,因为这意味着要把所有的工作都扔掉,然后我会用数学来创建过滤器。不过还是要谢谢你。我很难回答你的问题,因为你问的太多了。现在还不清楚你到底在问什么:如何构建过滤器?如何将过滤添加到音频流?您的筛选代码是否正确?你能把你的问题简化为一个问题吗,或者在最后总结一个要点问题清单?嗨,谢谢你回答我。真正的问题是:如何在核心音频中实现数字滤波器?我写的是我从DSP书中了解到的。我需要确认我写的东西是否正确。此外,阅读其他参考资料时会编写相关的代码以及要做什么(我报告了源代码和代码)。我试图把各种论点放在一起,但不幸的是没有成功。这就是为什么我提出这个问题,问我基于所读内容的推理是错误的还是公正的,以及如何继续前进。
for (int i = 0; i < 1024; i++) {
    double multiplier = 0.5 * (1 - cos(2*M_PI*i/1023));
    dataOut[i] = multiplier * dataIn[i];
}