最初,我有一个时间数组和一个电压数组,我应用了 FFT 并将该时域转换为频域。应用 FFT 后,我得到了一个频率数组。现在我已经截止频率,我需要在同一频率上实现低通滤波器。我需要使用 JAVA 来完成此操作。如果有任何可用的开源或任何实现相同的想法,请有人推荐我。任何使用频率值和截止频率实现的引用都会有所帮助。
我对这个话题完全陌生,所以我的问题方法可能有点奇怪。预先感谢您的支持!
最佳答案
由于您已经有了一个包含 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) 然后,将数组中索引上方的所有复数(k
乘以 N
)设置为零,其中 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 中所述。文档。
关于java - 使用JAVA通过仅具有频率阵列和截止频率来实现频率低通滤波器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24644496/