可以使用DirectSound轻松进行带状滤波吗?如果不是,我该怎么做?

问题描述:

我想知道这样的事情是否可行(并且相对容易),如果是这样,我该怎么做?可以使用DirectSound轻松进行带状滤波吗?如果不是,我该怎么做?

我愿做一个波形文件,我复制带滤波。类似于大多数类似Winamp的应用程序中的“均衡器”。
然而,我的想法不是要平衡声音,而是要使用非常高的负dB值,几乎杀死我正在过滤的频段。

第一个问题是:是否DirectSound的给我的东西,可以让我做到这一点?
如果不是:你将如何执行此操作?
我知道(尽管我完全不完全理解它),您可以使用快速傅里叶变换从采样波形转换为频率分布。现在,我显然不能再从该分配回原来的波形改变某些频率的幅度值:-)

我怎么会做这样的事情之后?

另外,我可以制作这些过滤器有多精确? (如果我要过滤掉一切从2250Hz到2275Hz,这将是错误的过滤器会呢?会的最大精度,我可以得到取决于什么?)

谢谢!

我不知道的DirectSound提供了这个功能,我认为它不会因为DSP是相当复杂的,往往是从形势变化很大,以情况。你想要做的是在DSP(数字信号处理)中通常称为“滤波”。很多时候这涉及使用FIR(有限脉冲响应)滤波器。有很多图书馆可以做你想要的东西。关于滤波器设计最棘手的方面是总是存在速度,精度和误差之间的折衷。在你的例子中,你将能够消除频率之间的信号,但这也会影响周围的频率。它会影响的数量与处理时间和滤波器设计有关。

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

然后为自己的Windows/DirectSound的特定FIR相关信息

DirectSound根本没有信号处理设施。有许多技术可以用来做你想做的事。可以使用FFT来做你想做的事情,但它可能不是最好或最简单的方法。您应该阅读音频DSP,特别是数字滤波(IIR,FIR)。在线免费提供了一本名为The Scientist and Engineer's Guide to Digital Signal Processing的DSP书,这绝对值得一看。也有可以从亚马逊的许多其他优秀的DSP书籍等

的DirectSound没有做带通滤波谷歌像你描述的在这里,因为据我所知。

后面的带通滤波的一般想法是使用延迟线,内搭信号输出后,反馈到输入流,具有指定的延迟时间和衰减(或衰减)的因素。仔细设计滤波器可以让您放大或衰减音频源中的特定频率范围。请注意,此技术不使用FFT,除了在测试滤波器效果时可能是诊断工具。 FFT技术可以更精确地限制或放大频率,但延迟线通常更快(并且更容易编码)。

要处理的WAV文件(而不是做实时合成/滤波),执行对音频缓冲延时线很简单,只要:

for (int i = 0; i < samples.Length - delay; i++) 
{ 
    samples[i + delay] += samples[i] * decay; 
} 

它在比这更复杂一点练习(例如,您必须处理潜在的溢出值,并且某些类型的延迟线必须反向运行,当然这在C风格编码中总是很痛苦)。

就过滤器的精确程度而言,这取决于它的设计程度(这非常困难)。当您使用延迟线设计滤波器时,您基本上正在做与电气工程师在便宜的微处理器之前几十年(并且仍然这样做)相同的事情。

我不知道任何直接处理这类事情的库。

你可以实现你想要的傅里叶变换,实现如FFTW你,但在我的experiance做的计算工作是非常讨厌的工作,并且使用的内存数量庞大,特别是如果你要处理更长一击中的音频位。

使用FFT应用等式的基本思路是这样的:

  1. 让您的声音。音频只是一个非常长的数值(样本),这是扬声器锥体的位移/随着时间的推移。
  2. 对音频进行傅立叶变换(库文件将执行此操作,但您必须将音频采样转换为正确的格式。这将基于时间的采样转换为基于频率的采样 - 实质上是将信号转换为显示frequenceies的distrobution在信号
  3. 鸿沟频率分布状态了 - 分裂distrobution成多个区域,每个区域将是频率的范围
  4. 然后,您可以在频段进行调整 - 为你的榜样,你可以将一个区域清零以除去所有的痕迹
  5. 对更新后的频率分布进行傅立叶逆变换,这会将表示返回到t他的时域,重建原始信号的(近似),但与您所做的调整。

做这样的事情可以让你准确地操纵音频中出现的频率,给你一种你似乎想要的控制。不过要注意的是,这不是直接执行。

我建议围绕这个问题阅读。节拍检测与许多此类节目密切相关(大量使用基本技术) - 以前几部分here作为开始。

希望有所帮助。

DirectSound可能不直接支持这个,但DirectShow应该。你可以用这个API来代替吗?

我第二个FIR滤波器的想法。为了获得狭窄的缺口,你需要一个很长的过滤器内核。

基本上你使用输入流与一组值(内核)的卷积。每个输出采样是前N个采样与滤波器内核中相应条目的乘积之和。

所以你需要保持一个内核数组和一个相同数量样本的FIFO或循环缓冲区。

他们是网络上的FIR滤波器内核计算器,只是谷歌“FIR滤波器计算器”。

你应该能够做一个FFT,在频域(缩放频率仓)中搞乱,然后做一个IFFT来恢复时域信号。否则,使用ScopeFIR或MATLAB设计滤波器非常容易。 ScopeFIR可以轻松设计带阻滤波器并给出系数,因此您可以对信号进行卷积。以下是ScopeFIR网站的教程:http://www.iowegian.com/fir/tutor/firintro.htm