0

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

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

4

3 回答 3

1

您在内部循环中乘以计算相位。倍频器的任何变化,您都会获得潜在的相位大幅跳跃,因此会出现“爆音”。

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

deltaPhase = 2.0 * pi * yourFrequency / sampleRate ;
于 2010-12-11T03:31:19.820 回答
0

我的猜测是,您只是更改了波形参数而没有在两个值之间进行平滑插值,因此您的波形被破坏并且听起来“静态”。

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

于 2010-12-11T03:30:32.880 回答
0

我认为以下帖子将解决您的问题:

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

于 2010-12-26T02:32:47.800 回答