首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何防止iPhone 3GS过滤低频(<150 How )

如何防止iPhone 3GS过滤低频(<150 How )
EN

Stack Overflow用户
提问于 2011-07-19 17:52:44
回答 3查看 1.5K关注 0票数 18

我正在iPhone3GS上开发一个低音吉他音调检测应用程序。我发现我无法用RemoteIO获得低于150‘t的声音数据。然而,低音吉他可能会产生低于50 may的音调。根据报告"iPhone 4耳机输入频率响应“,http://blog.faberacoustical.com/2010/iphone/iphone-4-audio-and-frequency-response-limitations/在150 Hz以下有一个急剧下降。

这里展示了如何设置AudioUnit。

代码语言:javascript
复制
// set audio unit
{
    // create AudioUnit
    {
        AudioComponentDescription desc;
        desc.componentType = kAudioUnitType_Output;
        desc.componentSubType = kAudioUnitSubType_RemoteIO;
        desc.componentManufacturer = kAudioUnitManufacturer_Apple;
        desc.componentFlags = 0;
        desc.componentFlagsMask = 0;

        AudioComponent comp = AudioComponentFindNext(NULL, &desc);
        OSAssert(AudioComponentInstanceNew(comp, &m_AudioUnit));
    }

    //enable input on the remote I/O unit (output is default enabled, but input is not)
    {
        UInt32 one = 1;
        OSAssert(AudioUnitSetProperty(m_AudioUnit, kAudioOutputUnitProperty_EnableIO,
                                      kAudioUnitScope_Input, 1, &one, sizeof(one)));
    }

    //set render callback function
    {
        AURenderCallbackStruct callbackInfo;
        callbackInfo.inputProc=staticPerformThru;
        callbackInfo.inputProcRefCon=this;

        OSAssert(AudioUnitSetProperty(m_AudioUnit,
                                      kAudioUnitProperty_SetRenderCallback,
                                      kAudioUnitScope_Input, 
                                      0, &callbackInfo, sizeof(callbackInfo)));

    }

    //set in/output format
    {
        CAStreamBasicDescription outFormat;
        outFormat.SetAUCanonical(channels, false);
        outFormat.mSampleRate = sampleRate;
        OSAssert(AudioUnitSetProperty(m_AudioUnit, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Input, 0, &outFormat, sizeof(outFormat)));
        OSAssert(AudioUnitSetProperty(m_AudioUnit, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Output, 1, &outFormat, sizeof(outFormat)));
    }

    //Initialize remote I/O unit
    OSStatus r=AudioUnitInitialize(m_AudioUnit);
    OSAssert(r);
}
//start audio output
OSAssert(AudioOutputUnitStart(m_AudioUnit));

这是回调函数。

代码语言:javascript
复制
OSStatus AudioThruWorker::staticPerformThru(
                                           void                     *inRefCon, 
                                           AudioUnitRenderActionFlags   *ioActionFlags, 
                                           const AudioTimeStamp         *inTimeStamp, 
                                           UInt32                       inBusNumber, 
                                           UInt32                       inNumberFrames, 
                                           AudioBufferList          *ioData)
{

    AudioUnitRender(((AudioThruWorker*)inRefCon)->m_AudioUnit, ioActionFlags, inTimeStamp, 1, inNumberFrames, ioData);

    //Detect pitch here...

    return 0;
}

为了找出根本原因,

  1. 我修改了我的回调函数以绕过输入数据进行输出。
  2. 使用Mac生成白噪声
  3. 使用iRig将信号从Mac的耳机重定向到正在运行我的程序的iPhone3Gs。
  4. 使用iRig将iPhone的输出重定向到Mac。
  5. 在Mac上记录数据。

输出数据谱如下图所示。

你可以看到150赫兹的急剧下降。

为了确定问题是在输入端还是在输出端,我更改了回调函数以忽略输入数据并输出白噪声。结果如下所示。

很清楚,在150赫兹没有下降。因此,问题应该出现在输入端。

我认为这是一个硬件限制。然而,我在同一设备上尝试了应用程序"Amplitube“,关闭了所有效果,输入白噪声并分析输出。它在150 at时没有降压。结果如下所示。

这意味着丢弃问题不是硬件限制。软件必须有一些方法来避免这个问题。

有人知道这个秘密吗?

谢谢。

EN

回答 3

Stack Overflow用户

发布于 2011-11-30 22:44:14

嗯,它是一部电话,一种理应为语音而优化的设备。为语音优化的设备通常有某种类型的低频截止滤波器,以避免隆隆和失真。

这个滤波器可能在电话的输入端,这就是为什么你可以产生和输出更大范围的频率,它可能是一个硬件/离散元素滤波器,因为这些滤波器很容易创建,只需使用几个组件,并且将实时工作,不会对处理造成任何影响。

我不认为在软件中降低低电平是有意义的,我知道我不会这么做,嗯,对于DAW应用程序,你可以这么做,但对于一个优化了过滤低电平的设备来说……

考虑到amplitube开发人员可能已经意识到了这个问题,并添加了额外的低boost来尝试弥补硬件限制?

另一方面,根据使用场景选择不同的“信号路径”是很有可能的,也许有一些操作系统处理应用程序可以触摸和说“嘿,我不是语音,不要降低我的低谷”-如果是这样的话,这个功能应该在api描述中的某个地方。

票数 2
EN

Stack Overflow用户

发布于 2011-07-27 07:57:31

这个问题很有趣。我不知道有这样的过滤器..。您可以在远程IO单元上设置输入回调,并获取浮点数流。

我还没有看到任何文档表明这个浮点流已经以某种方式被处理过了。

我已经写了一个音调检测器,它能在我的歌唱范围的低端(~80 my )成功地拾取音符。

也许post代码--你在这个回调里面做什么?

票数 0
EN

Stack Overflow用户

发布于 2011-07-30 16:32:24

我可以建议你重新问这个问题,用一个合适的标题(也许是“如何防止iPhone过滤低频(<150 is )”),并包含所有必要的信息,也坚持在图片中,这是问题的重要部分。嵌入一张图片非常容易。

你甚至还没有说明你想要实现的是什么。

看起来你是第一次访问这个网站,这看起来是一个非常有趣的问题。

但是你一点也不清楚。

首先,这是录音或回放的问题,还是两者都有?

现在,你在你的实验中到底在做什么?西方的科学方法。把它铺开。

你在你的remoteIO渲染回调中生成静态?不,听起来像是你在使用passthrough,你说你在iPhone中放入白噪声。您是如何设置音频单元的?

所以白噪声直接进入iPhone,然后...那么这张图代表了什么呢?iPhone输出的快速傅立叶变换/频谱分析?你是怎么做到的?你把它输入到一些OSX绘图软件中,它可以从行中接受输入?

另外,你也可以缩小范围。如果你真的通过设备传递声音,你不知道过滤发生在哪里。正如您所知道的,在生成白噪声的设备以及绘制iPhone输出的设备中可能会发生过滤。

如何从远程I/O渲染回调中生成白噪声?

然后在外部生成它,并分析从该回调中到达的数据--您可以执行FFT。

不管怎样,输入不同频率的正弦波不是更好吗?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6745303

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档