Java中,傅里葉變換是一種非常重要且基礎的算法,它可以將一個函數在時間域內的表達轉換成在頻率域內的表達。通過對時間域內的信號進行傅里葉變換,我們可以得到對應的頻域內的信號譜,進而方便地對信號進行濾波處理。
/** * 計算離散傅里葉變換 * * @param x 實數部分序列 * @param y 虛數部分序列 * @param ifft 是否執行反變換 * @return 變換結果 */ public static double[] dft(double[] x, double[] y, boolean ifft) { int n = x.length; double[] re = new double[n]; double[] im = new double[n]; double pi = ifft ? -Math.PI : Math.PI; for (int i = 0; i< n; i++) { for (int j = 0; j< n; j++) { double angle = pi * 2 * i * j / n; re[i] += x[j] * Math.cos(angle) + y[j] * Math.sin(angle); im[i] += -x[j] * Math.sin(angle) + y[j] * Math.cos(angle); } if (ifft) { re[i] /= n; im[i] /= n; } } return ifft ? re : complexMagnitude(re, im); }
以上代碼實現了離散傅里葉變換,其中x和y為序列的實部和虛部,ifft表示是否進行反變換。我們可以利用該函數對信號進行變換,得到頻域內的信號譜,然后進行濾波處理。
/** * 對時域信號譜進行低通濾波 * * @param signal 信號譜 * @param threshold 閾值 * @return 濾波后的信號譜 */ public static double[] lpFilter(double[] signal, double threshold) { int n = signal.length; for (int i = 1; i< n / 2; i++) { if (i<= threshold) { signal[i] = 0.0; signal[n - i] = 0.0; } } return signal; }
以上代碼實現了低通濾波,其中signal為時域內的信號譜,threshold為閾值。低通濾波可以過濾掉高于一定頻率的信號成分,實現去噪和信號平滑的目的。