【问题标题】:Implementing Low pass filter on frequencies using JAVA by just having frequency array and cut off frequency通过仅具有频率阵列和截止频率,使用 JAVA 对频率实现低通滤波器
【发布时间】:2014-08-29 22:28:57
【问题描述】:

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

我对这个话题完全陌生,所以我的提问方式可能有点奇怪。先谢谢支持!!!

【问题讨论】:

标签: java fft lowpass-filter


【解决方案1】:

由于您已经有一个包含 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) 然后将数组中索引 (kN) 上的所有 COMPLEX 数字设置为零,其中 N 是数组中的元素数,就这么简单,这将为您提供基本的 Low通过滤波器 (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 类的元素形式,因此请确保您知道数据的表示方式以及哪些数据元素设置为零。

这并不是一个真正的好方法,因为您的数据中的单个频率可能会因为泄漏而分布在多个 bin 中,因此在这种情况下结果会很糟糕。理想情况下,您会想要设计一个合适的数字滤波器或者只是使用一些软件库。因此,如果您需要一个非常精确的 LPF,您可以按照THIS 文档中讨论的那样,完成设计模拟 LPF 的正常过程,然后将其变形为数字滤波器。

【讨论】:

  • 所以,一个简单的 for 循环遍历整个频率数组,如果数组中的某个频率值超出截止频率,我可以将其转换为 0.00
  • 我说的对吗?或者您正在解释除此之外的其他内容?谢谢!!
  • 感谢 KillaKem,这有帮助。我在这里担心的是我不知道 FFt 和低通滤波器。我最近开始研究这些。我在一个数组中有一个时间值,我找到了一个 FFT 算法来转换到频域 [链接]wikijava.org/wiki/…。我已经传递了实数值作为上述算法的时间输入,并传递了一个空数组作为虚部。现在我需要对获得的频率值执行低通滤波器(这里我将切断频率),然后我需要将这些频率转换回时域
  • 我想我已经表达清楚了。您能否指导我在这种情况下如何处理低通滤波器。在上面提到的算法本身中,我可以实现逆变换。所以我正在寻找适合我需要的低通滤波器算法。
猜你喜欢
  • 2019-02-23
  • 2012-09-02
  • 2013-08-22
  • 2017-09-22
  • 1970-01-01
  • 2012-08-19
  • 1970-01-01
  • 1970-01-01
  • 2023-03-31
相关资源
最近更新 更多