Objective c 在同一AVAudioPCMBuffer中更改正弦波频率

Objective c 在同一AVAudioPCMBuffer中更改正弦波频率,objective-c,avfoundation,avaudioplayer,core-audio,Objective C,Avfoundation,Avaudioplayer,Core Audio,我一直在努力获得一种干净的正弦波声音,当播放不同的音符时,它可以改变频率。据我所知,我需要相对于频率调整缓冲区的帧长,以避免帧结束于正弦峰值时产生的弹出声音 所以在每次迭代中,我设置帧长,然后用信号填充缓冲区 AVAudioPlayerNode *audioPlayer = [[AVAudioPlayerNode alloc] init]; AVAudioPCMBuffer *buffer = [[AVAudioPCMBuffer alloc] initWithPCMFormat:[audioP

我一直在努力获得一种干净的正弦波声音,当播放不同的音符时,它可以改变频率。据我所知,我需要相对于频率调整缓冲区的帧长,以避免帧结束于正弦峰值时产生的弹出声音

所以在每次迭代中,我设置帧长,然后用信号填充缓冲区

AVAudioPlayerNode *audioPlayer = [[AVAudioPlayerNode alloc] init];
AVAudioPCMBuffer *buffer = [[AVAudioPCMBuffer alloc] initWithPCMFormat:[audioPlayer outputFormatForBus:0] frameCapacity:44100*10];`

while(YES){
    AVAudioFrameCount frameCount = ceil(44100.0/osc.frequency);
    [buffer setFrameLength:frameCount];
    [audioPlayer scheduleBuffer:buffer atTime:0 options:AVAudioPlayerNodeBufferLoops completionHandler:nil];
    for(int i = 0; i < [buffer frameLength]; i++){
        for (int channelNumber = 0; channelNumber < channelCount ; channelNumber++) {
            float * const channelBuffer = floatChannelData[channelNumber];
            channelBuffer[i] = [self getSignalOnFrame:i];
        }
    }
}
起始音听起来很好,当音符改变时没有弹出音,但音符本身听起来像是在变成锯齿波或什么的

有没有关于我在这里遗漏了什么的想法? 或者我应该为播放的每个音符创建一个全新的音频播放器,并添加一个新的缓冲区


谢谢你的建议

如果缓冲器是连续的,那么在正弦波生成中不存在间断的更好方法是记住一个缓冲器末端的正弦波相位,并将该相位用作生成下一个缓冲器的起点(角度)


如果缓冲区不是连续的,那么避免点击的一种常见方法是将每个缓冲区的第一个和最后几毫秒从完全增益逐渐减少到零。线性增益锥度可以,但升余弦锥度是稍微平滑的锥度。

如果缓冲器是连续的,那么在正弦波生成中不存在不连续性的更好方法是记住一个缓冲器末端的正弦波相位,并将该相位用作生成下一个缓冲器的起点(角度)

如果缓冲区不是连续的,那么避免点击的一种常见方法是将每个缓冲区的第一个和最后几毫秒从完全增益逐渐减少到零。线性增益锥度可以,但升余弦锥度稍微平滑一些

(float)getSignalOnFrame:(int)i {
     float sampleRate = 44100.0;
     return [osc amplitude] * sinf([osc frequency] * i * 2.0 * M_PI / sampleRate);
}