Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 过滤代码中的音频点击/弹出_C#_Audio_Filter_Signal Processing_Unity3d - Fatal编程技术网

C# 过滤代码中的音频点击/弹出

C# 过滤代码中的音频点击/弹出,c#,audio,filter,signal-processing,unity3d,C#,Audio,Filter,Signal Processing,Unity3d,我正在为Unity引擎中的音频过滤器创建一个C#脚本 我的问题是,在通过我的过滤器运行后,产生的音频具有一致且频繁的“点击”、“弹出”或“跳过”。听起来有点像旧收音机

我正在为Unity引擎中的音频过滤器创建一个C#脚本

我的问题是,在通过我的过滤器运行后,产生的音频具有一致且频繁的“点击”、“弹出”或“跳过”。听起来有点像旧收音机<我不确定这是什么原因造成的

这是我的密码:

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;
    }
}
公共浮动截止;
公众共鸣;
int采样器;
void Start()
{
截止值=200;
共振=1;
sampleRate=AudioSettings.outputSampleRate;
}
无效OnAudioFilterRead(浮点[]数据,整数通道)
{
浮点数c=2*Mathf.PI*截止/取样器;
浮子r=1/共振;
浮球v0=0;
浮动v1=0;
for(int i=0;i
这是您的文档。
这是我得到答案的地方

当切断接近其最大值(127)时,咔哒声和砰砰声变得更安静

我对音频编程相当陌生,这可能是显而易见的,所以我不确定是什么导致了它。
有没有比我更博学的人能解释一下我做错了什么


谢谢

点击和弹出的常见原因(按“共性”顺序)有:

  • 缓冲区长度错误(缓冲区重叠或无法填充到边界)
  • 您的示例正在剪裁,您没有像应该的那样处理它-例如,您正在用
    short
    s计算所有内容,而不关心如何包装这些值
  • 您的DSP算法运行不正常
  • 由于某些原因,您的算法太慢,并且音频样本未及时发送,导致音频间隔

一种很好的调试技术是尝试缩小问题的原因,例如,在处理音频的例程中直接插入PCM转储。这样,您就知道例程的输出是否正常,并能够相应地集中调试工作。

我已经解决了这个问题。我的c和r变量需要在调用OnAudioFilterRead()的整个过程中保持不变。让他们成为会员修复了它。这是我完整的工作代码:

using UnityEngine;
using System.Collections;
using System;

public class LowPassFilter : MonoBehaviour {

    public float cutoff;
    public float resonance;

    const float CUTOFF_MAX = 128.0f;
    const float CUTOFF_MIN = 0.0f;
    const float RESONANCE_MAX = 128.0f;
    const float RESONANCE_MIN = 0.0f;

    float c;
    float r;
    float v0;
    float v1;

    int sampleRate;

    void Start()
    {
        cutoff = 20.0f;
        resonance = 0.0f;

        c = 0.0f;
        r = 0.0f;
        v0 = 0.0f;
        v1 = 0.0f;

        sampleRate = AudioSettings.outputSampleRate;
    }

    void OnAudioFilterRead(float[] data, int channels)
    {
        cutoff = Mathf.Clamp(cutoff, CUTOFF_MIN, CUTOFF_MAX);
        resonance = Mathf.Clamp(resonance, RESONANCE_MIN, RESONANCE_MAX);

        c = Mathf.Pow(0.5f, (128.0f - cutoff) / 16.0f);
        r = Mathf.Pow(0.5f, (resonance + 24.0f) / 16.0f);

        for (int i = 0; i < data.Length; i++)
        {
            v0 =  ((1.0f - r * c) * v0)  -  (c * v1)  + (c * data[i]);
            v1 =  ((1.0f - r * c) * v1)  +  (c * v0);

            data[i] = Mathf.Clamp(v1, -1.0f, 1.0f);
        }
    }
}
使用UnityEngine;
使用系统集合;
使用制度;
公共类低通滤波器:单行为{
公众浮存资金切断;
公众共鸣;
恒浮截止_MAX=128.0f;
常数浮动截止值_MIN=0.0f;
恒浮谐振_MAX=128.0f;
恒浮谐振_MIN=0.0f;
浮点数c;
浮子r;
浮子v0;
浮动v1;
int采样器;
void Start()
{
截止值=20.0f;
共振=0.0f;
c=0.0f;
r=0.0f;
v0=0.0f;
v1=0.0f;
sampleRate=AudioSettings.outputSampleRate;
}
无效OnAudioFilterRead(浮点[]数据,整数通道)
{
切断=主夹(切断、最小切断、最大切断);
共振=主钳位(共振、共振最小值、共振最大值);
c=数学功率(0.5f,(128.0f-截止)/16.0f);
r=数学功率(0.5f,(谐振+24.0f)/16.0f);
for(int i=0;i
我还应该补充一点,除了点击和弹出之外,过滤器听起来不错。我已经找到了弹出可能的位置。如果我在听到咔嗒声/嗡嗡声并过滤后输出一大块样本,我会看到很多数字,比如4.739146e-05(正数和负数)。什么(可能在我的算法中)可能是这些数字的原因,和/或我将如何着手修复它们?感谢阅读。unity标签是针对Microsoft unity的。请不要误用。谢谢您的回复。我已经设法排除了你提出的第二种和第四种可能性,因为Unity为我提供了一个用于音频后期过滤器的方便的VU表,以及一个告诉我过滤器是否占用了太多时间的框。至于可能性1,我认为这不是问题所在,因为OnAudioFilterRead()是一个回调函数,它为我提供了一个预设的数据块。我认为可能性3是最有可能的。但问题是,我不知道哪里会出错。呃,当复制过滤器的代码时,您完全忽略了第二篇文章,其中解释和计算了sampleFreq和过滤器常数之间的关系。因此,你的滤波器工作在极低或极高的频率范围内,这取决于常数计算的方向。我已经尝试使用并调整了第二篇文章中的代码。问题仍然存在。正如我在帖子中所说,我对音频编程非常陌生。我可能忽略了一些简单的事情。简单的是你在任何地方都不使用采样率。想想看,过滤代码不能对任何采样率进行操作,所以应该以某种方式使用采样率。现在,看看如何使用它-使用你用来查找代码的链接中的第二篇文章。我已经尝试过使用该代码,但我还是再试了一次。我编辑了我的原始帖子,以反映我现在正在做的事情。静电/持久性有机污染物仍然存在。