用C / Java生成DSP滤波器系数用于时域卷积

时间:2011-11-04 18:22:07

标签: java android iphone signal-processing fft

我正在编写一款智能手机(Android,iPhone)应用程序,可以执行一些DSP。我是一位经验丰富的程序员。我还参加了DSP的一个本科EE课程,并且知道如何使用Matlab。

我想将低通和带通滤波器应用于我的时域信号。根据我的理解,我需要对时域样本和滤波器系数进行卷积。在Matlab中,我将使用fir1()函数来获取滤波器系数,并使用conv()/ filter()函数来应用卷积。

我知道如何在Java / C中编写卷积函数,但我不知道如何生成滤波器系数。我知道对于低通滤波器,系数来自sinc函数,带通滤波器基本上是移位的低通滤波器。 如何以编程方式生成这些系数?

4 个答案:

答案 0 :(得分:1)

有使用windowed-sinc方法on the nicholson.com dsp web page为低通和带通滤波器生成FIR系数的代码。代码大约是10行老式Basic,但应该可以简单地转换为C或Java。如果要重新派生代码,可以在该页面上进行说明。

当使用窗口sinc时,艺术是选择最佳窗口。更现代的方法,需要更少的猜测,是使用Remez交换算法从规范生成过滤器。

答案 1 :(得分:0)

我找到了一个用C ++代码生成过滤系数的教程,它应该相对容易转换成Java代码。可以在此处找到该教程:http://baumdevblog.blogspot.com/2010/11/butterworth-lowpass-filter-coefficients.html。我希望它对你有用。

这是一个非常有趣的主题,我正在考虑尽快做一个类似的项目:)

答案 2 :(得分:0)

除非您期望滤波器参数(带宽,过渡带等)发生变化,否则最简单的技术是在matlab中生成系数并在程序中对其进行硬编码。您会发现matlab可以生成具有窗口方法可以显着更少系数的良好滤波器。鉴于卷积是MxN(M =滤波器系数的数量,N是样本数)的命令操作,减少M可以在性能上产生很大的差异。

答案 3 :(得分:0)

过去,我成功地使用了Jake Janovetz用C语言编写的Parks-McClennan方法(Remez交换)版本,以编程方式生成带通FIR滤波器的系数。你可以尝试一下。