所以,前段时间我正在开发一个波浪发生器应用程序,遇到了一些问题,但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 {}都被触发了。有什么办法可以让它听起来更流畅吗?谢谢!
发布于 2010-12-11 11:31:20
你在你的内部循环中进行乘法运算来计算相位。频率倍增器的任何变化,你都会得到一个潜在的大幅相位跳跃,因此就会出现“爆裂”。
在内部循环中添加增量相位,而不是乘法。由于增量相只会有很小的变化,所以相位也会有很小的变化,并且会有更小的不连续。
deltaPhase = 2.0 * pi * yourFrequency / sampleRate ;发布于 2010-12-11 11:30:33
我的猜测是,你只是改变了波形参数,而没有平滑地在两个值之间进行插值,因此你的波形被打破了,听起来很“静态”。
更改波浪生成函数,使其在旧值(在帧的开头)和新值(在帧的结尾)之间进行插值。
发布于 2010-12-26 10:32:48
我认为下面的帖子可以解决你的问题:
http://cocoawithlove.com/2010/10/ios-tone-generator-introduction-to.html
https://stackoverflow.com/questions/4415016
复制相似问题