我正在学习DSP,但我对此有弱点。
我在读这个:http ://www.eetimes.com/document.asp?doc_id=1275556
但是,我不知道如何选择低通滤波器。
我假设这取决于采样频率,但我需要“与粘土一样”的解释。
我知道什么是 FIR 低通滤波器,但我不知道这种情况的规格是什么(抽取)..
谢谢!!
我正在学习DSP,但我对此有弱点。
我在读这个:http ://www.eetimes.com/document.asp?doc_id=1275556
但是,我不知道如何选择低通滤波器。
我假设这取决于采样频率,但我需要“与粘土一样”的解释。
我知道什么是 FIR 低通滤波器,但我不知道这种情况的规格是什么(抽取)..
谢谢!!
当您抽取信号 x(n) 到 x(an) (a>1) 时,在频域中频谱会扩展。这可能会导致相邻光谱带的混叠。因此,为了避免这种情况,我们使用“抗混叠滤波器”。
现在选择 FIR 低通滤波器取决于许多因素,例如滤波器的阶数、阻带衰减、通带频率范围等。
据我所知,在设计滤波器时,采样根本不是问题。您只需在过滤后抽取信号。
举个例子,在数字通信的基带部分,在发射机侧,您对信号进行上采样并使用抗成像滤波器,以避免重复相同频谱的多个副本。在接收器中,您首先过滤掉信号,然后对其进行抽取以进行进一步处理。
干杯,帕尼特吉
首先,您的 FIR LPF 设计取决于采样率、最大频率、截止频率、带宽和脉冲响应等因素。要生成脉冲响应,您可以使用 sinc 函数。
阅读 sinc 函数:- http://www.dspguide.com/ch11/2.htm
阅读低通滤波器:- http://www.analog.com/media/en/technical-documentation/dsp-book/dsp_book_Ch16.pdf
根据您的问题,我了解您询问如何根据采样率选择截止频率。如果是这样的话,我会用一个例子来简要介绍一下。
因此,考虑一个采样率为 1000sps 的输入信号。让我们假设我们只想通过高达 100Hz 的频率并阻止高于 100Hz 的更高频率。所以,现在你的截止频率是 100 Hz。请注意,您选择的截止频率必须低于信号中存在的最大频率。数学上:
我们知道,采样率,
F_s = 1000 sps
那么最大频率由下式给出,
F_max = F_s/2 = 1000/2 = 500 Hz
因此,从上面我们知道信号中存在的最大频率为 500 Hz,因此,您选择的截止频率必须低于 500 Hz 以避免混叠。所以,一般来说,截止频率的值必须在 0 到 0.5 之间。由于归一化的采样频率值为 1,而 0.5 表示采样率的一半,在这种情况下为 500。
在我们的示例中,我们选择了 100 Hz 的截止频率,因此在数学上:
cut off frequency, F_c = 100/1000 = 0.1 ---> Less than 0.5 i.e. 500 Hz
而且,只是为了便于理解,如果我们选择了 600 Hz 而不是 100 Hz 的截止频率呢?让我们计算一下。
F_c = 600/1000 = 0.6 -----> Greater than 0.5
在上面,我们可以看到选择的截止频率大于 500 Hz,这会产生混叠。所以为了避免这种情况,我们总是选择 F_c 小于 0.5。
但是,在设计 FIR LPF 时,还必须考虑其他因素,例如过渡带宽和脉冲响应长度。
现在进入下采样,这基本上意味着您从现有的样本中删除一些样本以减少输出信号中存在的样本数量。我将提供一个简单的下采样代码供您了解:
int M; // sampling factor - integer value
int N = 1024;
double *inputsignal[N]; // generate input signal/data using sin function
double *outputsignal[N]; // To accumulate the downsampled signal
int input_samplerate; // input signal sampling rate
int output_samplerate; // desired output signal sampling rate
int set_input_output_samplerate(); //function to set rate & calc factor
int downconvert();
int set_input_output_samplerate()
{
M = input_samplerate/output_samplerate; // for 100/50 = M = 2
return M;
}
int downconvert()
{
int index = 0;
for(int i =0 ; i<input_samplerate/M ; i++)
{
outputsignal[index++] = inputsignal[i*M]; //drop 2 samples from input for each iteration and copy the data to output array and increment it
}
}
int main()
{
call set_input_output_samplerate(); //call function to set rate & calc M
call downconvert(); // call function to downsample
}
注意:以上代码仅用于整数因子下采样,不包括过滤。因此,您必须在使用上述方法对其进行下采样之前对信号进行低通滤波。我希望这有帮助。