【问题标题】:Removal of frequencies in speech below 100 Hz去除低于 100 Hz 的语音频率
【发布时间】:2016-01-12 23:33:01
【问题描述】:

我尝试仅使用 FFT(因为我不应该使用任何过滤器)从我的语音样本(使用 Octave)中删除所有低于 100 Hz 的频率。但是,当我播放样本时,听起来好像波形失真了。经过反复试验,我将频率从 2Hz 移除到 100Hz,听起来比以前更好。我的问题是:由于人类的听觉范围是从 20 Hz 到 20 kHz,那么如果范围是从 2 到 100 Hz,语音样本的声音怎么会更好呢?代码如下:

n1=1+round(0/fsamplingn):1+round(98/fsamplingn); --to remove the original frequencies
n2=1+n-round(98/fsn):1+n-round(0/fsn); -- to remove mirror
yf=fft(y); --fourier of voice
yf(n1)=0; yf(n2)=0;

【问题讨论】:

  • 这样的频域处理需要使用overlap-add或者overlap-save。
  • 请出示代码。
  • 请注意 fsampling 是采样频率,即 20khz,n 是采样总数。我试图将 n1 和 n2 处的傅立叶变换为零,范围为 0Hz 到 98Hz。下面是sn-p:n1=1+round(0/fsamplingn):1+round(98/fsamplingn); --去除原来的频率 n2=1+n-round(98/fsn):1+n-round(0/fsn); -- 删除镜像 yf=fft(y); -- 语音 yf(n1)=0 的傅立叶; yf(n2)=0;
  • edit任何相关代码进入您的问题。另请说明您是否知道需要对此类处理使用重叠添加/重叠保存,因为任何答案都取决于您在此方面的进展情况。
  • 我对重叠添加/保存一无所知。你能告诉我同样的事情吗?非常感谢!

标签: filtering signal-processing fft octave speech


【解决方案1】:

对于这样的频域处理,您需要使用Overlap-addOverlap-save 方法。

基本上,您采用短重叠样本块(通常为 10 毫秒或 20 毫秒左右 - 足够短,可以认为该块在统计上是静止的)、FFT、频域处理、IFFT、然后根据您要使用的上述两种方法中的任何一种添加或保存一半的块。

还请注意,您不应该只是在频域中任意将 bin 归零,因为这会导致时域中出现伪影(“振铃”) - 当您在通带和阻带。

至于您问题的最后一部分,即使您过滤掉 300 Hz - 3 kHz 范围之外的所有内容,语音也完全可理解。这通常是电话中使用的频率响应。因此,删除 100 Hz 以下的所有内容应该没什么区别。当然,如果您使用 20 Hz - 20 kHz 的全部范围,质量会更好,但我们不需要所有带宽仅用于语音通信。

【讨论】:

  • 我明白这一点,但我目前必须在没有任何过滤器且仅使用基本 fft/ifft 命令的情况下完成此任务。您能否让我知道如何使用我在问题中提到的代码删除镜像频率。感谢您的耐心等待!
  • 您显然想要实现的是高通滤波,显然您的任务是使用 FFT 来执行此操作,而不是时域中的显式过滤器。这称为“频域滤波”。它类似于“快速卷积”。如果您阅读了上面的答案并点击链接,您将看到如何在 MATLAB/Octave/whatever 中执行此操作 - 除了 FFT/IFFT 之外,它只需要一些额外的步骤。不需要实际的过滤器!
  • 当然 - 我也用更多信息更新了上面的答案。
  • 不错的答案;顺便说一句,OP 出错的是他说他的音频采样率为 20kHz 和 20kHz 带宽——因为音频通常被采样为真实信号,奈奎斯特不允许这样做!全带宽为 10kHz。我也懒得在我的回答中提到这一点,因为绝对频率在这里并不重要。
  • 谢谢 - 我没有注意到任何提到采样率 - 我看到你也提供了一个很好的详细答案 - 也给你投票!
【解决方案2】:

仅使用 FFT(因为我不应该使用任何过滤器)。

您刚刚构建了一个过滤器!解释一下:从数学上讲,将 FIR 应用于数字信号(我认为这是您不允许允许做的事情)是信号与滤波器抽头向量的卷积。

时域的卷积是频域的乘法; Paul R's remarks about overlap applying.

当您将要抑制的频率区间设为 0 时,您所做的是在频域中与 a 相乘

[0, 0, ..., 0, 1, 1, ..., 1, 0, 0, ..., 0]

向量。

因此,您已经对信号进行了过滤,在数学上 100% 相当于应用了一个 FIR 滤波器,该滤波器会重置每个 FFT 长度样本。

为了说明:我们将使用频域掩码

[1]*400+[0]*224+[1]*400

使用 1024-FFT。 GNU Radio 有一个适当重叠的 FFT 滤波器的实现,因此我们可以直接将其效果与 FIR 滤波器的效果进行比较;因为两个 GNU Radio 滤波器实现都需要时域抽头,所以我们必须首先对频域抽头进行 IDFT 处理¹。然后,我们用来自高白源的高斯噪声刺激滤波器。整个系统如下所示:

运行时,会产生以下图:

注意 FIR 和 FFT 滤波器响应如何完美地重叠;这并不奇怪,因为它们在数学上是等价的


¹要完全正确地做到这一点,我必须先对这些水龙头应用一个窗口,因为这也是 GNU Radio 的 FFT 过滤器所做的,但这会使您的问题范围如此显着,以至于我决定不这样做;因此,滤波器响应不是很尖锐或很深,但在通带边缘有很强的过冲。

【讨论】:

  • 感谢您提供的所有信息。但是,我不应该使用重叠方法或任何与过滤器相关的东西。我只是应该使用 fft 并删除垃圾箱,即使它不是最好的方法。如果在同一方向上提供帮助,将不胜感激。谢谢
  • 你正在构建一个过滤器。告诉自己不允许构建过滤器是没有用的。
猜你喜欢
  • 2023-03-31
  • 1970-01-01
  • 2012-07-26
  • 2018-10-22
  • 1970-01-01
  • 1970-01-01
  • 2018-09-30
  • 1970-01-01
  • 2012-07-21
相关资源
最近更新 更多