Audio 我可以用DirectSound轻松地进行波段过滤吗?如果没有,我怎么做?

Audio 我可以用DirectSound轻松地进行波段过滤吗?如果没有,我怎么做?,audio,filtering,signal-processing,waveform,equalizer,Audio,Filtering,Signal Processing,Waveform,Equalizer,我想知道这样的事情是否可能(并且相对容易做到),如果是的话,我怎么能做到 我想对我正在复制的波形文件进行带通滤波。与大多数类似Winamp的应用程序中的“均衡器”类似。 然而,我的想法不是均衡声音,而是使用非常高的负分贝值,几乎杀死我过滤的频带 第一个问题是:DirectSound是否为我提供了允许我这样做的功能? 如果没有:您将如何实施此计划? 我知道(尽管我不完全理解),你可以使用快速傅立叶变换将采样波形转换为频率分布。现在,在改变某些频率的振幅值之后,我显然不能从这个分布回到原始波形:-)

我想知道这样的事情是否可能(并且相对容易做到),如果是的话,我怎么能做到

我想对我正在复制的波形文件进行带通滤波。与大多数类似Winamp的应用程序中的“均衡器”类似。
然而,我的想法不是均衡声音,而是使用非常高的负分贝值,几乎杀死我过滤的频带

第一个问题是:DirectSound是否为我提供了允许我这样做的功能?
如果没有:您将如何实施此计划?
我知道(尽管我不完全理解),你可以使用快速傅立叶变换将采样波形转换为频率分布。现在,在改变某些频率的振幅值之后,我显然不能从这个分布回到原始波形:-)

我怎么能做这样的事

另外,我可以如何精确地制作这些过滤器?(如果我想过滤掉从2250Hz到2275Hz的所有信号,那么滤波器会有什么误差?我能得到的最大精度取决于什么?)


谢谢

DirectSound根本不提供任何信号处理设备。你可以使用各种各样的技术来做你想做的事情。可以使用FFT做你想做的事情,但它可能不是最好或最简单的方法。您应该阅读音频DSP,特别是数字滤波(IIR,FIR)。有一本很好的DSP书可以在网上免费获得,书名叫《DSP》,绝对值得一看。亚马逊等网站还提供了许多其他优秀的DSP书籍。

我不知道DirectSound是否提供了这一功能,我想不会,因为DSP相当复杂,而且常常因情况而异。在DSP(数字信号处理)中,您要做的通常称为“滤波”。很多时候,这涉及到使用FIR(有限脉冲响应)滤波器。有许多库可以完全满足您的需要。滤波器设计中最棘手的一个方面是,在速度、精度和误差之间总是存在权衡。在您的示例中,您将能够删除频率之间的信号,但这也会影响周围的频率。其影响程度与处理时间和过滤器设计有关

也许从这里开始(数学重):


那么,据我所知,谷歌搜索您自己的Windows/DirectSound特定FIR相关信息时,DirectSound不会像您在这里描述的那样进行频带过滤

带通滤波的基本思想是使用延迟线,以指定的延迟时间和衰减(或衰减)系数将信号输出并反馈回输入流。滤波器的精心设计将允许您放大或衰减音频源中的特定频率范围。请注意,该技术不使用FFT,除非在测试滤波器效果时可能用作诊断工具。FFT技术可以更精确地限制或放大频率,但延迟线通常更快(编码也更容易)

为了处理WAV文件(与实时合成/过滤相反),在音频缓冲区上执行延迟线非常简单:

for (int i = 0; i < samples.Length - delay; i++)
{
    samples[i + delay] += samples[i] * decay;
}
for(int i=0;i
当然,在实践中要比这复杂一些(例如,您必须处理潜在的溢出值,并且某些类型的延迟线必须反向运行,这在C风格的编码中总是一个难题)


至于滤波器的精度,这取决于它的设计有多好(这是非常困难的)。当你用延迟线设计一个滤波器时,你基本上是在做同样的事情,就像电气工程师在廉价微处理器出现之前的几十年里所做的一样(现在仍然如此)。

我不知道有哪个库可以直接处理这类事情

你可以通过傅里叶变换来实现你想要的,像的实现可以为你做计算工作,但以我的经验来说,使用傅里叶变换非常麻烦,并且使用了大量的内存,特别是如果你想在一次点击中处理更长的音频位

使用FFT应用eq的基本思想如下:

  • 获取您的音频。音频只是一个很长的值(样本)数组,它是扬声器圆锥体/随时间的位移
  • 以音频的傅里叶变换为例(库可以做到这一点,但你必须将音频样本分流到正确的格式。这将基于时间的样本转换为基于频率的表示-本质上这将转换信号以显示信号中频率的分布
  • 将频率分布向上划分-将分布划分为多个区域,每个区域将是一个频率范围
  • 然后,您可以对频带执行调整-例如,您可以将一个区域归零,以删除其所有轨迹
  • 对更新后的频率分布进行傅里叶逆变换。这会将表示返回到时域,重建原始信号的(近似值),但需要进行调整
  • 这样做可以让你准确地控制音频中的频率,从而达到你想要的控制效果。不过,请注意,这并不容易实现

    我建议大家围绕这个主题来阅读。节拍检测与很多这方面有着非常密切的联系(经常使用基本技术)-试着从前几个部分开始


    希望这有点帮助。

    DirectSound可能不直接支持这一点,但DirectShow应该支持。你能改用那个API吗?

    我支持FIR滤波器的想法。要获得窄陷波,你需要一个长的滤波器内核

    基本上你使用卷积