通过使用频率阵列和截止频率,使用JAVA在频率上实现低通滤波器

时间:2014-07-09 02:29:31

标签: java fft lowpass-filter

最初,我有一个时间阵列和一个电压阵列,我已应用FFT并将该时域转换为频域。应用FFT后,我得到了一个频率数组。现在我已切断频率,我需要在同一个上实现低通滤波器。我需要使用JAVA来做到这一点。如果有任何可用的开源或任何实现相同的想法,有人可以推荐我。任何使用频率值和截止频率实现的参考都会有所帮助。

我对这个话题完全不熟悉,所以我的问题方法可能有点奇怪。在此先感谢您的支持!

1 个答案:

答案 0 :(得分:2)

由于您已经有一个包含FFT值的数组,您可以通过将对应于截止值以上频率的FFT系数设置为零来实现非常粗略的低通滤波器。如果您需要更好的滤波器,您可以实现数字过滤器或在线查找LPF实现,并使用它。

编辑:计算FFT后你没有得到一个频率数组,你会得到一个代表数据大小和相位的复数数组。你应该能够知道每个复数的频率是多少。数组对应,因为FFT结果将对应于从0到f_s的均匀间隔频率,其中f_s是用于获取数据的采样频率。

一个有用的练习可能是首先尝试绘制频谱,因为在绘制之后,很清楚如何丢弃高频,从而实现LPF。这个稍微相似的帖子可能对你有所帮助:LINK

编辑:1)首先,您需要找到数据的采样频率(f_s),这是每秒采样的数量。可以使用f_s = 1/T计算,其中T是时域中任意两个连续样本之间的时间间隔。

2)在此之后,您将f_c除以f_s,其中f_c是获得常数k的截止频率。

3)然后,将所有COMPLEX数字设置为数组中索引(kN)之上的零,其中N是数组中元素的数量,简单如此,这将给出你是一个基本的低通滤波器(LPF)。

下面的粗略,指示性(伪)代码:

Complex[] fftData = FFT(myData);
int N = fftData.Length;

float T = 0.001;   
float f_c = 500;   //f_c = 500Hz
float f_s = 1/T;   //f_s = 1000Hz

float k = f_c/f_s;
int index = RoundToNextLargestInteger(k * N);

//Low pass filter   
for(int i = index; index < N; index++)
   fftData[i] = 0;

在您的情况下,您收到的fftData将不会是Complex类中的元素形式,因此请确保您知道数据的表示方式以及将哪些数据元素设置为零

这不是一个很好的方法,但是由于泄漏会导致数据中的单个频率分布在几个箱子上,因此在这种情况下结果会很糟糕。理想的是,您需要设计一个合适的数字滤波器或者只是使用一些软件库。因此,如果您需要非常精确的LPF,您可以完成设计模拟LPF的正常过程,然后将其变形为数字滤波器,如THIS文档中所述。