我正在为 Unity 引擎中的音频过滤器创建一个 C# 脚本。
我的问题是,在通过我的过滤器运行后,生成的音频具有一致且频繁的“咔哒声”、“砰砰声”或“跳过声”。听起来有点像旧 radio 。
我不确定是什么原因造成的。
这是我的代码:
public float cutoff;
public float resonance;
int sampleRate;
void Start()
{
cutoff = 200;
resonance = 1;
sampleRate = AudioSettings.outputSampleRate;
}
void OnAudioFilterRead(float[] data, int channels)
{
float c = 2 * Mathf.PI * cutoff/sampleRate;
float r = 1 / resonance;
float v0 = 0;
float v1 = 0;
for (int i = 0; i < data.Length; i++)
{
v0 = (1 - r * c) * v0 - (c) * v1 + (c) * data[i];
v1 = (1 - r * c) * v1 + (c) * v0;
data[i] = v1;
}
}
这是 OnAudioFilterRead() 的文档.
这是我得到 original low-pass code 的地方.
随着截频值接近最大值 (127),咔哒声和爆裂声变得更小。
我对音频编程相当陌生,这可能很明显,所以我不确定是什么原因造成的。
有比我知识渊博的人能解释一下我做错了什么吗?
谢谢!
最佳答案
咔哒声和爆裂声的常见原因(按“常见程度”排序)是:
- 错误的缓冲区长度(您重叠缓冲区或未能将其填充到边界)
- 您的样本正在裁剪,您没有按照应有的方式处理它 - 例如,您正在计算
short
中的所有内容,并且不关心包装值 - 您的 DSP 算法表现不佳
- 您的算法由于某种原因太慢,音频样本未及时传送,导致音频间隙
一个很好的调试技术是尝试缩小问题的原因,例如,将 PCM 转储直接插入处理音频的例程中。这样,您就会知道例程的输出是否正常,并能够相应地集中调试工作。
关于c# - 来自过滤器代码的音频点击/弹出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12990423/