首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用remoteIO生成iPhone音频时如何防止爆音?

用remoteIO生成iPhone音频时如何防止爆音?
EN

Stack Overflow用户
提问于 2010-12-11 11:26:11
回答 3查看 850关注 0票数 0

所以,前段时间我正在开发一个波浪发生器应用程序,遇到了一些问题,但Kenny Winker是一个真正的救星,他帮助我基本上完成了所有的工作。然而,我最终遇到的一个问题是,每当我改变我正在使用的频率值时(当我改变音量值时,程度要小得多),我最终会得到这些丑陋的爆裂“爆裂”噪音。这是一个问题,因为整个问题是能够使用滑块平滑地改变波的频率和音量,而听起来像皱纹纸张的声音真的会破坏这种效果。下面是我的OSStatus中控制音量/频率的代码。

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

SlidersViewController *me = (SlidersViewController *)inRefCon;

static int phase = 1;

for(UInt32 i = 0; i < ioData->mNumberBuffers; i++) {

    int samples = ioData->mBuffers[i].mDataByteSize / sizeof(SInt16);

    SInt16 values[samples];

    float waves;


    for(int j = 0; j < samples; j++) {


        waves = 0;



        waves += sin(kWaveform * me.fr1 * phase)*(me.vol1);
        waves += sin(kWaveform * me.fr2 * phase)*(me.vol2);
        waves += sin(kWaveform * me.fr3 * phase)*(me.vol3);
        waves *= sin(kWaveform * (me.fr4/100) * phase)*(me.vol4);   
        waves *= 32500 / 4;

        values[j] = (SInt16)waves;
        values[j] += values[j]<<16;

        phase++;


    }

    memcpy(ioData->mBuffers[i].mData, values, samples * sizeof(SInt16));

}

return noErr;}

正如您可能看到的,obj-c变量"fr1"-"fr4“控制频率,而"vol1”到"vol4“控制振幅。这些值每次都会更新

代码语言:javascript
复制
- (void) touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {}

代码语言:javascript
复制
- (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {}

都被触发了。有什么办法可以让它听起来更流畅吗?谢谢!

EN

回答 3

Stack Overflow用户

发布于 2010-12-11 11:31:20

你在你的内部循环中进行乘法运算来计算相位。频率倍增器的任何变化,你都会得到一个潜在的大幅相位跳跃,因此就会出现“爆裂”。

在内部循环中添加增量相位,而不是乘法。由于增量相只会有很小的变化,所以相位也会有很小的变化,并且会有更小的不连续。

代码语言:javascript
复制
deltaPhase = 2.0 * pi * yourFrequency / sampleRate ;
票数 1
EN

Stack Overflow用户

发布于 2010-12-11 11:30:33

我的猜测是,你只是改变了波形参数,而没有平滑地在两个值之间进行插值,因此你的波形被打破了,听起来很“静态”。

更改波浪生成函数,使其在旧值(在帧的开头)和新值(在帧的结尾)之间进行插值。

票数 0
EN

Stack Overflow用户

发布于 2010-12-26 10:32:48

我认为下面的帖子可以解决你的问题:

http://cocoawithlove.com/2010/10/ios-tone-generator-introduction-to.html

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

https://stackoverflow.com/questions/4415016

复制
相关文章

相似问题

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