消除低于100 Hz的语音频率

时间:2015-10-14 18:19:54

标签: filtering signal-processing fft octave speech

我尝试仅使用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;

2 个答案:

答案 0 :(得分:1)

对于此类频域处理,您需要使用Overlap-addOverlap-save方法。

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

另请注意,您不应该只是在频域中随意清零分档,因为这会在时域中产生伪影("振铃") - 您需要使用平滑的&#34 ;窗口"在通带和阻带之间转换时起作用。

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

答案 1 :(得分:1)

  

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

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

时域卷积是频域倍增; Paul R's remarks about overlap applying

当您设置要抑制的频率区间0时,您正在做的是在频域中乘以

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

矢量。

所以,你已经过滤了你的信号,在数学上100%相当于应用你重置每个FFT长度样本的FIR滤波器。

举例说明:我们将使用频域掩码

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

使用1024-FFT。 GNU Radio实现了正确重叠的FFT滤波器,因此我们可以直接将其效果与FIR滤波器的效果进行比较。因为两个GNU无线电滤波器实现都需要时域分接头,所以我们必须首先对IDFT频域分接¹。然后我们用来自高度白色光源的高斯噪声激发滤波器。整个系统看起来像:

GNU Radio companion Flow Graph

并在运行时生成以下图表:

Frequency domain analysis

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

¹要完全正确地执行此操作,我必须首先对这些点击应用一个窗口,因为这也是GNU Radio的FFT过滤器所做的,但是这会使你的问题的范围如此显着我决定不这样做;因此,滤波器响应不是非常尖锐或深,但在通带边缘处具有强过冲。