gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 01:04:34 28 4
gpt4 key购买 nike

所以,不久前我正在开发一个波浪发生器应用程序并且遇到了一些问题,但肯尼温克是一个真正的救星,帮助我基本上让一切顺利进行。然而,我最终遇到的一个问题是,每当我改变我正在使用的频率的值时(当我改变音量的值时,程度要小得多),我最终会得到这些丑陋的噼啪声爆裂”的声音。这是一个问题,因为重点是能够用 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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com