c# - 来自过滤器代码的音频点击/弹出

标签 c# audio filter signal-processing unity3d

我正在为 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/

相关文章:

java - Java设置麦克风电平

arrays - 如何过滤嵌套数组作为响应?

python - 从列表末尾过滤元素

c# - DataMember IsRequired 属性与 Nullable 类型的组合是否矛盾?

c# - 您知道执行此 "massive"linq 过滤的另一种方法吗?

audio - 提取音频文件的二进制表示

html - 在移动 safari 上自动播放音频

python - 如何获得今天 - PySpark(SQL) 中的 “6 months” 日期

c# - 使用 ComVisible 导出到 COM 时是否可以隐藏类父级?

c# - 尝试使用 Google.Apis.Gmail 从 ASP.NET Core Web API 应用程序从 google 工作区发送电子邮件时出错