java实现FIR滤波器(附完整源码)
时间: 2023-11-09 07:06:47 浏览: 64
下面是一个简单的Java实现FIR滤波器的代码,包括滤波器设计和信号处理两个部分。
首先是滤波器设计部分,其中定义了一个函数firCoefficients,它生成了FIR滤波器的系数。这里采用了一个经典的窗函数法进行滤波器设计,具体细节见代码注释。
```java
public class FIRFilter {
private double[] coefficients;
public FIRFilter(double[] coefficients) {
this.coefficients = coefficients;
}
public double[] filter(double[] inputSignal) {
int M = coefficients.length;
int N = inputSignal.length;
double[] outputSignal = new double[N + M - 1];
// Zero padding the input signal
double[] inputSignalPadded = new double[N + M - 1];
for (int n = 0; n < N; n++) {
inputSignalPadded[n] = inputSignal[n];
}
// Convolution
for (int n = 0; n < N + M - 1; n++) {
for (int m = 0; m < M; m++) {
if (n - m >= 0 && n - m < N) {
outputSignal[n] += coefficients[m] * inputSignalPadded[n - m];
}
}
}
return outputSignal;
}
public static double[] firCoefficients(int M, double fc, double fs) {
double[] h = new double[M];
// Generate the impulse response
for (int n = 0; n < M; n++) {
if (n == (M - 1) / 2) {
h[n] = 2 * fc / fs;
} else {
h[n] = Math.sin(2 * Math.PI * fc * (n - (M - 1) / 2) / fs) / (Math.PI * (n - (M - 1) / 2));
}
h[n] *= 0.54 - 0.46 * Math.cos(2 * Math.PI * n / (M - 1));
}
return h;
}
}
```
接下来是信号处理部分,使用上面定义的FIRFilter类进行信号滤波。这里简单地生成了一个正弦信号和一个噪声信号,并对它们进行了滤波,输出了滤波后的信号。
```java
public class Main {
public static void main(String[] args) {
// Generate a sine wave signal
double A = 1;
double f = 1000;
double fs = 8000;
double[] t = new double[8000];
double[] x = new double[8000];
for (int n = 0; n < 8000; n++) {
t[n] = n / fs;
x[n] = A * Math.sin(2 * Math.PI * f * t[n]);
}
// Generate a noise signal
double[] y = new double[8000];
Random rand = new Random();
for (int n = 0; n < 8000; n++) {
y[n] = rand.nextGaussian();
}
// Filter the signals
double fc = 500;
int M = 101;
double[] h = FIRFilter.firCoefficients(M, fc, fs);
FIRFilter filter = new FIRFilter(h);
double[] xFiltered = filter.filter(x);
double[] yFiltered = filter.filter(y);
// Plot the signals
Plot2DPanel plot = new Plot2DPanel();
plot.addLinePlot("x", Color.BLUE, t, x);
plot.addLinePlot("xFiltered", Color.RED, t, xFiltered);
plot.addLinePlot("y", Color.GREEN, t, y);
plot.addLinePlot("yFiltered", Color.ORANGE, t, yFiltered);
JFrame frame = new JFrame("FIR Filter");
frame.setContentPane(plot);
frame.setSize(800, 600);
frame.setVisible(true);
}
}
```
以上代码使用了Java绘图库JMathPlot来实现信号的可视化,如果没有安装该库,请先进行安装。