所以,不久前我正在研究一个波浪发生器应用程序并遇到一些问题,但Kenny Winker是一个真正的救生员,并帮助我基本上把一切都搞定了。然而,我最终遇到的一个问题是,无论何时我改变我正在使用的频率值(当我改变音量值的程度要小得多)时,我最终会得到这些丑陋的“弹出“噪音。这是一个问题,因为整个问题是能够用滑块平滑地改变波的频率和音量,听起来像皱巴巴的纸真的会破坏这种效果。以下是控制音量/频率的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 {}
被触发。有关如何解决这个问题的想法让它听起来更顺畅吗? 谢谢!
答案 0 :(得分:1)
你在内循环中乘以计算相位。频率倍增器的任何变化都会导致阶段性的大跳跃,从而产生“砰”的一声。
不是乘法,而是在内循环中添加delta阶段。由于三角洲阶段只会发生少量变化,相位也会发生变化,并且会出现更小的不连续性。
deltaPhase = 2.0 * pi * yourFrequency / sampleRate ;
答案 1 :(得分:0)
我的猜测是你只是改变了波形参数而没有在这两个值之间平滑插值,因此你的波形会被破坏并且听起来很“严重”。
更改波形生成函数,使其在旧值(帧的开头)和新值(帧的结尾)之间进行插值。
答案 2 :(得分:0)