Как предотвратить потрескивание звука при генерации аудио с iPhone при помощи remoteIO? - PullRequest
0 голосов
/ 11 декабря 2010

Итак, некоторое время назад я работал над приложением генератора волн и столкнулся с некоторыми проблемами, но Кенни Уинкер был настоящим спасителем и помог мне в принципе все начать. Однако одной проблемой, с которой я столкнулся, является тот факт, что всякий раз, когда я изменяю значение частоты, которую я использую (и в гораздо меньшей степени, когда я изменяю значение громкости), я в конечном итоге получаю эти уродливые трещины ». появляются "шумы". Это проблема, поскольку весь смысл в том, чтобы иметь возможность плавно изменять частоту и громкость волны с помощью ползунка, и то, что походит на мятую бумагу, может действительно разрушить этот эффект. Вот код моего 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 {}

срабатывает. Любые идеи о том, как это исправить, чтобы это звучало более гладко? Спасибо!

Ответы [ 3 ]

1 голос
/ 11 декабря 2010

Вы умножаете свой внутренний цикл для расчета фазы. Любое изменение в множителе частоты и вы можете получить большой скачок в фазе, и, таким образом, «поп».

Вместо умножения добавьте дельта-фазу во внутреннем цикле. Поскольку дельта-фаза будет изменяться только на небольшое количество, фаза также будет меняться, и будет намного меньше разрывов.

deltaPhase = 2.0 * pi * yourFrequency / sampleRate ;
0 голосов
/ 26 декабря 2010

Я думаю, что следующий пост решит ваш вопрос:

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

0 голосов
/ 11 декабря 2010

Я предполагаю, что вы просто изменяете параметры волны без плавной интерполяции между двумя значениями, поэтому ваша форма волны прерывается и звучит "статично".

Измените функцию генерации волны, чтобы она интерполировала между старым значением (в начале кадра) и новым значением (в конце кадра).

...