iphone - 使用 remoteIO 生成 iPhone 音频时如何防止爆音?

标签 iphone objective-c audio waveform

所以,不久前我正在开发一个波浪发生器应用程序并且遇到了一些问题,但肯尼温克是一个真正的救星,帮助我基本上让一切顺利进行。然而,我最终遇到的一个问题是,每当我改变我正在使用的频率的值时(当我改变音量的值时,程度要小得多),我最终会得到这些丑陋的噼啪声爆裂”的声音。这是一个问题,因为重点是能够用 slider 平滑地改变波的频率和音量,而听起来像皱纸的声音真的会破坏这种效果。这是我的 OSStatus 控制音量/频率的代码。

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”控制幅度。这些值每次都会更新
- (void) touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {}

或者
- (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {}

被触发。有关如何解决此问题以使其听起来更流畅的任何想法?
谢谢!

最佳答案

您在内部循环中乘以计算相位。倍频器的任何变化,您都会获得潜在的相位大幅跃迁,从而产生“爆音”。

而不是相乘,而是在您的内部循环中添加增量相。由于 delta-phase 只会发生少量变化,因此相位也会发生变化,并且会出现更小的不连续性。

deltaPhase = 2.0 * pi * yourFrequency / sampleRate ;

关于iphone - 使用 remoteIO 生成 iPhone 音频时如何防止爆音?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4415016/

相关文章:

iphone - 我可以从 iphone 应用程序发出 POST 或 GET 请求吗?

python - 读取缓冲区中的 *.wav 文件

javascript - 跟踪 HTMLAudio 播放的总时间

qt - 如何设置手机存储卡的路径?

iphone - 我是否仍需要在带有 ARC 的 viewDidUnload 中将 IBOutlet 属性设置为 null

iphone - 当有一个时为零值

ios - 在 iOS 9.2 中使用企业部署创建 ipa 文件

objective-c - .m 文件中方法的顺序对编译器重要吗?

objective-c - 在 objective-c 中将两个音频文件合并为一个

iphone - 如何通过phonegap打开iPhone应用程序