Reverb.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);
}
}
}
好的,我收到了很多信息,但我在实施它时遇到了麻烦。有人可以提供帮助吗,这可能是我正在伪造的东西。它只是正常播放,稍微提升但没有延迟。
答案 0 :(得分:1)
您对x0[]
变量的处理看起来不正确 - 您拥有它的方式,左右声道将混合在一起。您为左通道分配x0[j]
,然后
使用正确的频道数据覆盖x0[j]
。所以延迟信号x0[j-D]
会
始终对应于右声道,延迟的左声道数据丢失。
您没有说出您的采样率是多少,但对于典型的音频应用,a 三样本延迟可能没有太大的听觉效果。在44.1 ksamp / sec, 在3个样本延迟时,滤波器响应的峰值和谷值将为 14,700赫兹的倍数。你所能得到的只是音频中的一个峰值 范围,在几乎没有任何功率的光谱的一部分(假设 信号是语音或音乐。)