混响.m
#define D 1000
OSStatus MusicPlayerCallback(
void* inRefCon,
AudioUnitRenderActionFlags * ioActionFlags,
const AudioTimeStamp * inTimeStamp,
UInt32 inBusNumber,
UInt32 inNumberFrames
AudioBufferList * ioData){
MusicPlaybackState *musicPlaybackState = (MusicPlaybackState*) inRefCon;
//Sample Rate 44.1
float a0,a1;
double y0, sampleinp;
//Delay Gain
a0 = 1;
a1 = 0.5;
for (int i = 0; i< ioData->mNumberBuffers; i++){
AudioBuffer buffer = ioData->mBuffers[i];
SIn16 *outSampleBuffer = buffer.mData;
for (int j = 0; j < inNumberFrames*2; j++) {
//Delay Left Channel
sampleinp = *musicPlaybackState->samplePtr++;
/* IIR equation of Comb Filter
y[n] = (a*x[n])+ (b*x[n-D])
*/
y0 = (a0*sampleinp) + (a1*sampleinp-D);
outSample[j] = fmax(fmin(y0, 32767.0), -32768.0);
j++;
//Delay Right Channel
sampleinp = *musicPlaybackState->samplePtr++;
y0 = (a0*sampleinp) + (a1*sampleinp-D);
outSample[j] = fmax(fmin(y0, 32767.0), -32768.0);
}
}
}
好吧,我得到了很多信息,但我在实现它时遇到了困难。有人可以帮忙吗,这可能是我很容易忘记的事情。它只是正常播放,有一点增强,但没有延迟。
最佳答案
您对x0[]
的对待变量看起来不正确——按照你的方式,左 channel 和右 channel 将混合在一起。您分配给x0[j]
对于左声道,则
覆盖x0[j]
具有正确的 channel 数据。所以延迟信号x0[j-D]
将要
始终对应右声道,延迟的左声道数据丢失。
您没有说您的采样率是多少,但对于典型的音频应用程序来说, 三个样本的延迟可能不会产生太大的听觉效果。在 44.1 ksamp/秒时, 使用 3 个样本延迟时,滤波器响应的波峰和波谷将位于 14,700 Hz 的倍数。您将得到的只是音频中的单个峰值 范围,在频谱的一部分,几乎没有任何功率(假设 信号是语音或音乐)。
关于iphone - IIR 梳状滤波器帮助,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5068832/