javaweb(四)——过滤器与监听器
文章目录
- 过滤器Filter
- 基本概念
- 滤波器的分类:
- 时域和频域表示
- 滤波器类型
- 1. 低通滤波器(Low-Pass Filter)
- 2. 高通滤波器(High-Pass Filter)
- 3. 带通滤波器(Band-Pass Filter)
- 4. 带阻滤波器(Band-Stop Filter)
- 滤波器参数
- 1. 通带频率(Passband Frequency)
- 2. 截止频率(Cutoff Frequency)
- 3. 通带波动(Passband Ripple)
- 4. 阻带衰减(Stopband Attenuation)
- 5. 群延迟(Group Delay)
- 6. 相位响应(Phase Response)
- 滤波器设计
- 1. 窗函数法
- 2. 频率采样法
- 3. 最小二乘法
- 4. 极点优化法
- 滤波器实现
- 1. 有限脉冲响应(FIR)滤波器
- 2. 无限脉冲响应(IIR)滤波器
- 3. 有限脉冲响应(FIR)滤波器的优化
- 4. 无限脉冲响应(IIR)滤波器的优化
- 数字滤波器的稳定性
- 1. 极点分布法
- 2. 频率响应法
- 滤波器的性能评价
- 1. 幅频特性曲线
- 2. 相频特性曲线
- 3. 群延迟曲线
- 实际应用
- 1. 音频处理
- 2. 图像处理
- 3. 通信系统
- 4. 控制系统
- 高级主题
- 1. 自适应滤波
- 2. 多速率信号处理
- 3. 小波变换
- 4. 滤波器组
- 监听器
- 1. 概念
- 2. Java代码详解
- Ajax
- 1. 实现原理
- 2. 优点
- 3. 实现方式
- 4. 总结
![在这里插入图片描述](https://img-blog.csdnimg.cn/c6d9d610071542d899b3c34f2154cd50.png)
过滤器Filter
基本概念
了解滤波器的定义、分类和工作原理等基本概念。 滤波器(Filter)是信号处理领域中的一个重要概念,可以将输入信号按照一定的规则进行处理,以获得期望的输出信号。滤波器广泛应用于通信、音频、视频等领域。
滤波器的分类:
- 按照处理方式分:时域滤波器和频域滤波器。 1. 按照响应特性分:低通滤波器、高通滤波器、带通滤波器和带阻滤波器等。 1. 按照传递函数分:FIR滤波器和IIR滤波器。 1. 按照实现方式分:模拟滤波器和数字滤波器。
下面是一个简单的Java代码示例,用于实现一个简单的低通滤波器:
public class LowPassFilter {<!-- -->private double alpha;private double y;public LowPassFilter(double alpha) {<!-- -->this.alpha = alpha;y = 0;}public double filter(double x) {<!-- -->y = alpha * x + (1 - alpha) * y;return y;}
}
上面的代码中,LowPassFilter
类实现了一个简单的低通滤波器,该滤波器使用参数 alpha
来控制滤波器的截止频率。在每次调用 filter
方法时,输入信号 x
会被滤波器处理,并输出滤波后的结果 y
。
使用该滤波器可以实现信号的平滑处理,例如可以对传感器采集的数据进行滤波以去除噪声。
时域和频域表示
掌握如何用时域和频域表示滤波器和滤波效果。 时域表示和频域表示是描述滤波器及其效果的两种不同方式。
- 时域表示:时域表示是指对滤波器在时间上的响应进行分析。在时域中,我们可以观察到滤波器对输入信号的响应情况,包括时间延迟、振幅变化、相位变化等。 1. 频域表示:频域表示是指对滤波器的传递函数进行分析。在频域中,我们可以观察到滤波器对输入信号在不同频率下的响应情况,包括滤波器在不同频率下的增益和相位变化等。
下面是一个简单的Java代码示例,用于实现一个低通滤波器并进行时域和频域表示:
public class LowPassFilter {<!-- -->private double alpha;private double y;public LowPassFilter(double alpha) {<!-- -->this.alpha = alpha;y = 0;}public double filter(double x) {<!-- -->y = alpha * x + (1 - alpha) * y;return y;}public double[] timeDomainResponse(double[] input) {<!-- -->int n = input.length;double[] output = new double[n];for(int i = 0; i < n; i++) {<!-- -->output[i] = filter(input[i]);}return output;}public Complex[] frequencyDomainResponse(int n, double fs) {<!-- -->double[] h = new double[n];for(int i = 0; i < n; i++) {<!-- -->double f = (double) i / n * fs;double w = 2 * Math.PI * f / fs;h[i] = 1 / (1 + alpha * (Math.exp(-Complex.I.multiply(w)).subtract(1)));}return FFT.fft(h);}
}
上面的代码中,LowPassFilter
类实现了一个简单的低通滤波器,并提供了两个方法:timeDomainResponse
和 frequencyDomainResponse
。前者用于计算滤波器在时域上对输入信号的响应,后者用于计算滤波器在频域上的传递函数。
在 frequencyDomainResponse
方法中,我们使用了快速傅里叶变换(FFT)来计算滤波器的频域响应。具体地,我们先根据采样率 fs
和采样点数 n
计算出频率步长 df = fs / n
,然后遍历所有频率点,利用滤波器的传递函数计算出相应的频域响应,最后再通过FFT计算得到结果。
这样的代码示例可以帮助我们更好地理解滤波器的时域和频域表示,以及它们之间的关系。
滤波器类型
学习低通、高通、带通和带阻等不同类型的滤波器,并了解它们的特性和应用场景。 滤波器(Filter)是一种信号处理器件,其作用是在特定频率范围内改变信号的幅度和相位。根据不同的频率响应特性,可以将滤波器分为低通、高通、带通和带阻等不同类型。
1. 低通滤波器(Low-Pass Filter)
低通滤波器是一种只允许低于截止频率的信号通过的滤波器。其主要特点是在截止频率以下的信号通过,而高于截止频率的信号被阻隔。低通滤波器常用于去除高频噪声、平滑信号等场合。
Java代码实现:
public class LowPassFilter {<!-- -->private double alpha;private double[] output;public LowPassFilter(double alpha) {<!-- -->this.alpha = alpha;output = new double[1];}public double filter(double input) {<!-- -->output[0] = (alpha * input) + ((1 - alpha) * output[0]);return output[0];}
}
2. 高通滤波器(High-Pass Filter)
高通滤波器是一种只允许高于截止频率的信号通过的滤波器。其主要特点是在截止频率以上的信号通过,而低于截止频率的信号被阻隔。高通滤波器常用于去除低频噪声、强调高频信号等场合。
Java代码实现:
public class HighPassFilter {<!-- -->private double alpha;private double[] output;public HighPassFilter(double alpha) {<!-- -->this.alpha = alpha;output = new double[1];}public double filter(double input) {<!-- -->output[0] = (alpha * output[0]) + (alpha * (input - output[0]));return input - output[0];}
}
3. 带通滤波器(Band-Pass Filter)
带通滤波器是一种只允许特定频率范围内的信号通过的滤波器。其主要特点是在中心频率附近的信号通过,而低于和高于该范围的信号被阻隔。带通滤波器常用于音频处理、通信系统等领域。
Java代码实现:
public class BandPassFilter {<!-- -->private double alpha;private double centerFrequency;private double bandwidth;private double[] output;public BandPassFilter(double alpha, double centerFrequency, double bandwidth) {<!-- -->this.alpha = alpha;this.centerFrequency = centerFrequency;this.bandwidth = bandwidth;output = new double[1];}public double filter(double input) {<!-- -->double omega = 2 * Math.PI * centerFrequency;double delta = 2 * Math.sin(omega) / alpha;double a = 1 + delta;double b = -2 * Math.cos(omega);double c = 1 - delta;double d = 2 * Math.cos(omega);double e = -1;double k = (2 * Math.PI * bandwidth) / alpha;double f = 2 * Math.sin(k);output[0] = (a * output[0]) + (b * output[1]) + (c * output[2]) + (d * input) + (e * input);output[2] = output[1];output[1] = output[0];return f * output[0];}
}
4. 带阻滤波器(Band-Stop Filter)
带阻滤波器是一种只阻隔特定频率范围内的信号通过的滤波器。其主要特点是在中心频率附近的信号被阻隔,而低于和高于该范围的信号通过。带阻滤波器常用于去除某一频率范围内的噪声、其他干扰等场合。
Java代码实现:
public class BandStopFilter {<!-- -->private double alpha;private double centerFrequency;private double bandwidth;private double[] output;public BandStopFilter(double alpha, double centerFrequency, double bandwidth) {<!-- -->this.alpha = alpha;this.centerFrequency = centerFrequency;this.bandwidth = bandwidth;output = new double[2];}public double filter(double input) {<!-- -->double omega = 2 * Math.PI * centerFrequency;double delta = 2 * Math.sin(omega) / alpha;double a = 1 + delta;double b = -2 * Math.cos(omega);double c = 1 - delta;double k = (2 * Math.PI * bandwidth) / alpha;double d = 2 * Math.cos(k);output[0] = (a * input) + (b * output[1]) + (c * output[2]);output[2] = output[1];output[1] = output[0];return output[0] - (d * output[1]);}
}
以上是四种常用的滤波器类型,它们各自具有不同的特点和应用场景。需要根据实际需求选择合适的滤波器,并结合实际情况进行参数调整。
滤波器参数
熟悉滤波器相关的参数,包括通带频率、截止频率、通带波动、阻带衰减、群延迟和相位响应等。
1. 通带频率(Passband Frequency)
通带频率是指信号通过滤波器时,能够通过的最高频率或最低频率。
Java代码实现:
通带频率可以作为滤波器的构造参数之一,也可以在滤波器内部计算得到。
public class LowPassFilter {<!-- -->private double alpha;private double passbandFrequency;private double[] output;public LowPassFilter(double alpha, double passbandFrequency) {<!-- -->this.alpha = alpha;this.passbandFrequency = passbandFrequency;output = new double[1];}// 计算截止频率public double getCutoffFrequency() {<!-- -->return passbandFrequency / Math.sqrt(1 - Math.pow(alpha, 2));}// ... 其他代码
}
2. 截止频率(Cutoff Frequency)
截止频率是指信号通过滤波器时,能够通过的最高频率或最低频率。对于低通滤波器,截止频率是指能够通过的最高频率;对于高通滤波器,则是指能够通过的最低频率。
Java代码实现:
截止频率可以作为滤波器的构造参数之一,也可以在滤波器内部计算得到。
public class HighPassFilter {<!-- -->private double alpha;private double cutoffFrequency;private double[] output;public HighPassFilter(double alpha, double cutoffFrequency) {<!-- -->this.alpha = alpha;this.cutoffFrequency = cutoffFrequency;output = new double[1];}// ... 其他代码
}
3. 通带波动(Passband Ripple)
通带波动指的是滤波器在通带范围内的幅度变化程度。一般来说,通带波动越小,滤波器的性能越好。
Java代码实现:
通带波动可以作为滤波器的构造参数之一。
public class BandPassFilter {<!-- -->private double alpha;private double centerFrequency;private double bandwidth;private double passbandRipple;private double[] output;public BandPassFilter(double alpha, double centerFrequency, double bandwidth, double passbandRipple) {<!-- -->this.alpha = alpha;this.centerFrequency = centerFrequency;this.bandwidth = bandwidth;this.passbandRipple = passbandRipple;output = new double[1];}// ... 其他代码
}
4. 阻带衰减(Stopband Attenuation)
阻带衰减指的是滤波器在阻带范围内的信号强度降低程度。一般来说,阻带衰减越大,滤波器的性能越好。
Java代码实现:
阻带衰减可以作为滤波器的构造参数之一。
public class BandStopFilter {<!-- -->private double alpha;private double centerFrequency;private double bandwidth;private double stopbandAttenuation;private double[] output;public BandStopFilter(double alpha, double centerFrequency, double bandwidth, double stopbandAttenuation) {<!-- -->this.alpha = alpha;this.centerFrequency = centerFrequency;this.bandwidth = bandwidth;this.stopbandAttenuation = stopbandAttenuation;output = new double[2];}// ... 其他代码
}
5. 群延迟(Group Delay)
群延迟指的是滤波器对信号引起的时延。一般来说,群延迟越小,滤波器的性能越好。
Java代码实现:
群延迟可以在滤波器内部计算得到。
public class LowPassFilter {<!-- -->private double alpha;private double passbandFrequency;private double[] output;public LowPassFilter(double alpha, double passbandFrequency) {<!-- -->this.alpha = alpha; this.passbandFrequency = passbandFrequency;output = new double[1];}// 计算群延迟public double getGroupDelay() {<!-- -->return 0.5 * (1 - alpha) / (2 * Math.PI * passbandFrequency);}// ... 其他代码
}
6. 相位响应(Phase Response)
相位响应指的是滤波器对信号引起的相位变化。不同类型的滤波器对相位的影响也不同,一般来说,保持相位不变或者产生线性相移的滤波器更为常见。
Java代码实现:
相位响应可以在滤波器内部计算得到。
public class HighPassFilter {<!-- -->private double alpha;private double cutoffFrequency;private double[] output;public HighPassFilter(double alpha, double cutoffFrequency) {<!-- -->this.alpha = alpha;this.cutoffFrequency = cutoffFrequency;output = new double[1];}// 计算相位响应public double getPhaseResponse(double frequency) {<!-- -->double omega = 2 * Math.PI * frequency;return -Math.atan(alpha * Math.sin(omega) / (1 - alpha * Math.cos(omega)));}// ... 其他代码
}
以上是滤波器相关的参数,它们能够帮助我们评估滤波器的性能和适用场景,并根据需要进行参数调整。
滤波器设计
掌握各种滤波器设计方法,包括窗函数法、频率采样法、最小二乘法和极点优化法等。 滤波器是数字信号处理中十分重要的一部分,可以用来去除信号中的噪声、选择特定频率范围内的信号等。以下是各种滤波器设计方法的详细概念和Java代码实现。
1. 窗函数法
窗函数法是一种常见的理想滤波器设计方法,其基本思想是在频域上使用一个矩形窗函数作为滤波器的频率响应,然后将其变换到时域上得到实际的滤波器系数。这种方法的主要优点是简单易懂,但缺点是会产生较大的纹波和截止带宽过渡区域较宽的问题。
下面是一个简单的Java代码示例:
public class WindowFilter {<!-- -->public static double[] lowPass(int M, double fc) {<!-- -->double[] h = new double[M + 1];for (int n = 0; n <= M; n++) {<!-- -->if (n == M / 2) h[n] = 2 * fc;else h[n] = Math.sin(2 * Math.PI * fc * (n - M / 2)) / (Math.PI * (n - M / 2));h[n] *= 0.54 - 0.46 * Math.cos(2 * Math.PI * n / M);}return h;}public static double[] highPass(int M, double fc) {<!-- -->double[] h = new double[M + 1];for (int n = 0; n <= M; n++) {<!-- -->if (n == M / 2) h[n] = 1 - 2 * fc;else h[n] = -Math.sin(2 * Math.PI * fc * (n - M / 2)) / (Math.PI * (n - M / 2));h[n] *= 0.54 - 0.46 * Math.cos(2 * Math.PI * n / M);}return h;}public static void main(String[] args) {<!-- -->int M = 31;double[] hlp = lowPass(M, 0.4);double[] hhp = highPass(M, 0.4);System.out.println("Low pass filter coefficients:");for (int i = 0; i < hlp.length; i++) {<!-- -->System.out.printf("%.3f ", hlp[i]);}System.out.println("\nHigh pass filter coefficients:");for (int i = 0; i < hhp.length; i++) {<!-- -->System.out.printf("%.3f ", hhp[i]);}}
}
2. 频率采样法
频率采样法是一种比较常用的滤波器设计方法,其基本思想是通过对目标滤波器的理想频率响应进行采样,得到离散的频率响应后再进行离散余弦变换(DCT)或者离散傅里叶变换(DFT),最终得到实际的滤波器系数。这种方法的优点是可以比较精确地设计滤波器,但缺点是需要进行频率采样,会产生一些采样误差。
下面是一个简单的Java代码示例:
public class FrequencySamplingFilter {<!-- -->public static double[] lowPass(int M, double[] f, double[] a) {<!-- -->int L = f.length;double[] h = new double[M + 1];for (int n = 0; n <= M; n++) {<!-- -->double hn = 0;for (int k = 0; k < L; k++) {<!-- -->hn += a[k] * Math.cos(2 * Math.PI * f[k] * (n - M / 2));}h[n] = hn / L;}return h;}public static double[] highPass(int M, double[] f, double[] a) {<!-- -->int L = f.length;double[] h = new double[M + 1];for (int n = 0; n <= M; n++) {<!-- -->double hn = 0;for (int k = 0; k < L; k++) {<!-- -->hn += a[k] * Math.cos(2 * Math.PI * f[k] * (n - M / 2));}h[n] = (k % 2 == 0 ? 1 : -1) * hn / L;}return h;}public static void main(String[] args) {<!-- -->int M = 31;double[] f = {<!-- -->0, 0.2, 0.3, 0.5};double[] a = {<!-- -->1, 1, 0, 0};double[] hlp = lowPass(M, f, a);double[] hhp = highPass(M, f, a);System.out.println("Low pass filter coefficients:");for (int i = 0; i < hlp.length; i++) {<!-- -->System.out.printf("%.3f ", hlp[i]);}System.out.println("\nHigh pass filter coefficients:");for (int i = 0; i < hhp.length; i++) {<!-- -->System.out.printf("%.3f ", hhp[i]);}}
}
3. 最小二乘法
最小二乘法是一种通过线性拟合的方式来设计滤波器的方法,其基本思想是寻找一个滤波器系数向量,使得该向量与目标响应之间的误差平方和最小。这种方法的优点是可以比较精确地设计滤波器,但缺点是计算量较大。
下面是一个简单的Java代码示例:
public class LeastSquaresFilter {<!-- -->public static double[] lowPass(int M, double fc) {<!-- -->int N = M + 1;double[] t = new double[N];double[] b = new double[N];for (int n = 0; n < N; n++) {<!-- -->t[n] = 2 * Math.PI * fc * (n - M / 2);b[n] = (n == M / 2 ? 2 * fc : Math.sin(t[n]) / t[n]);}Matrix A = new Matrix(N, N);for (int i = 0; i < N; i++) {<!-- -->for (int j = 0; j < N; j++) {<!-- -->A.set(i, j, b[Math.abs(i - j)]);}}Matrix B = new Matrix(N, 1);B.set(M / 2, 0, 2 * fc);Matrix X = A.solve(B);double[] h = new double[M + 1];for (int n = 0; n <= M / 2; n++) {<!-- -->h[n] = X.get(M / 2 - n, 0);}for (int n = M / 2 + 1; n <= M; n++) {<!-- -->h[n] = X.get(n - M / 2, 0);}return h;}public static double[] highPass(int M, double fc) {<!-- -->int N = M + 1;double[] t = new double[N];double[] b = new double[N];for (int n = 0; n < N; n++) {<!-- -->t[n] = 2 * Math.PI * fc * (n - M / 2);b[n] = (n == M / 2 ? 1 - 2 * fc : -Math.sin(t[n]) / t[n]);}Matrix A = new Matrix(N, N);for (int i = 0; i < N; i++) {<!-- -->for (int j = 0; j < N; j++) {<!-- -->A.set(i, j, b[Math.abs(i - j)]);}}Matrix B = new Matrix(N, 1);B.set(M / 2, 0, 1 - 2 * fc);Matrix X = A.solve(B);double[] h = new double[M + 1];for (int n = 0; n <= M / 2; n++) {<!-- -->h[n] = X.get(M / 2 - n, 0) * (n % 2 == 0 ? 1 : -1);}for (int n = M / 2 + 1; n <= M; n++) {<!-- -->h[n] = X.get(n - M / 2, 0) * (n % 2 == 0 ? 1 : -1);}return h;}public static void main(String[] args) {<!-- -->int M = 31;double[] hlp = lowPass(M, 0.4);double[] hhp = highPass(M, 0.4);System.out.println("Low pass filter coefficients:");for (int i = 0; i < hlp.length; i++) {<!-- -->System.out.printf("%.3f ", hlp[i]);}System.out.println("\nHigh pass filter coefficients:");for (int i = 0; i < hhp.length; i++) {<!-- -->System.out.printf("%.3f ", hhp[i]);}}
}
4. 极点优化法
极点优化法是一种将滤波器设计问题转化为寻找最佳极点位置的方法,其基本思想是在预设截止频率范围内选择若干个复平面上的点作为极点,然后计算出对应的幅度响应和相位响应,以此得到实际的滤波器系数。这种方法的优点是可以比较精确地设计滤波器,但缺点是计算量较大。
下面是一个简单的Java代码示例:
public class PoleZeroFilter {<!-- -->public static double[] lowPass(int M, double fc) {<!-- -->double[] p = new double[M / 2];for (int k = 0; k < M / 2; k++) {<!-- -->double theta = Math.PI * (2 * k + 1) / (2 * M);p[k] = -Math.sin(theta) / Math.cos(theta);}ComplexDouble[] zeros = new ComplexDouble[0];ComplexDouble[] poles = new ComplexDouble[M / 2];for (int k = 0; k < M / 2; k++) {<!-- -->poles[k] = new ComplexDouble(p[k], 0);}FilterCoefficients coeffs = new FilterCoefficients(zeros, poles, 1.0);double[] h = coeffs.getImpulseResponse(M + 1);return h;}public static double[] highPass(int M, double fc) {<!-- -->double[] p = new double[M / 2];for (int k = 0; k < M / 2; k++) {<!-- -->double theta = Math.PI * (2 * k + 1) / (2 * M);p[k] = -Math.sin(theta) / Math.cos(theta);}ComplexDouble[] zeros = new ComplexDouble[1];zeros[0] = new ComplexDouble(0, 0);ComplexDouble[] poles = new ComplexDouble[M / 2];for (int k = 0; k < M / 2; k++) {<!-- -->poles[k] = new ComplexDouble(p[k], 0);}FilterCoefficients coeffs = new FilterCoefficients(zeros, poles, -1.0);double[] h = coeffs.getImpulseResponse(M + 1);return h;}public static void main(String[] args) {<!-- -->int M = 31;double[] hlp = lowPass(M, 0.4);double[] hhp = highPass(M, 0.4);System.out.println("Low pass filter coefficients:");for (int i = 0; i < hlp.length; i++) {<!-- -->System.out.printf("%.3f ", hlp[i]);}System.out.println("\nHigh pass filter coefficients:");for (int i = 0; i < hhp.length; i++) {<!-- -->System.out.printf("%.3f ", hhp[i]);}}
}
滤波器实现
了解滤波器的实现方法,包括有限脉冲响应(FIR)和无限脉冲响应(IIR)结构等。 滤波器是一种信号处理工具,它可以将输入信号通过某些特定的算法转换为特定频率范围内的输出信号。在实际应用中,有两种常见的滤波器实现方法:有限脉冲响应(FIR)和无限脉冲响应(IIR)结构。
1. 有限脉冲响应(FIR)滤波器
有限脉冲响应(FIR)滤波器是一种基于线性时不变系统的滤波器,其特点是具有有限长度的单位冲激响应。FIR滤波器可以通过卷积运算来实现,因此也称为卷积滤波器。FIR滤波器的优点是稳定、易于设计,但缺点是需要较大的存储空间和处理时间,且对于高阶滤波器,其相位响应可能会引入延迟。
下面是一个简单的Java代码示例,实现了一个10阶低通FIR滤波器:
public class FIRFilter {<!-- -->private double[] b; // FIR filter coefficientsprivate double[] x; // input bufferprivate int pos; // current position in input bufferpublic FIRFilter(double[] b) {<!-- -->this.b = b;this.x = new double[b.length];this.pos = 0;}public double filter(double input) {<!-- -->x[pos] = input;double output = 0;for (int i = 0; i < b.length; i++) {<!-- -->output += b[i] * x[(pos + b.length - i) % b.length];}pos = (pos + 1) % b.length;return output;}public static void main(String[] args) {<!-- -->double[] b = {<!-- -->0.1, 0.2, 0.3, 0.4};FIRFilter filter = new FIRFilter(b);double[] input = {<!-- -->0.5, 0.6, 0.7, 0.8, 0.9};for (double x : input) {<!-- -->System.out.printf("%.3f ", filter.filter(x));}}
}
2. 无限脉冲响应(IIR)滤波器
无限脉冲响应(IIR)滤波器是一种基于反馈系统的滤波器,其特点是具有无限长度的单位冲激响应。IIR滤波器可以通过递归运算来实现,因此也称为递归滤波器。IIR滤波器的优点是存储空间和处理时间更低,且对于高阶滤波器,其相位响应可能会更加平稳,但缺点是可能不稳定,需要进行稳定性分析和设计。
下面是一个简单的Java代码示例,实现了一个一阶低通IIR滤波器:
public class IIRFilter {<!-- -->private double a; // IIR filter coefficientprivate double b; // IIR filter coefficientprivate double yPrev; // previous output valuepublic IIRFilter(double a, double b) {<!-- -->this.a = a;this.b = b;this.yPrev = 0;}public double filter(double input) {<!-- -->double output = b * input + a * yPrev;yPrev = output;return output;}public static void main(String[] args) {<!-- -->double a = 0.5;double b = 0.5;IIRFilter filter = new IIRFilter(a, b);double[] input = {<!-- -->0.5, 0.6, 0.7, 0.8, 0.9};for (double x : input) {<!-- -->System.out.printf("%.3f ", filter.filter(x));}}
}
以上是有限脉冲响应(FIR)和无限脉冲响应(IIR)滤波器的概念和Java代码实现。接下来,我们将介绍如何对这两种滤波器进行优化。
3. 有限脉冲响应(FIR)滤波器的优化
FIR滤波器的性能取决于其滤波器系数的数量,因此可以通过优化滤波器系数来提高其性能。常见的优化方法包括:
- 窗函数法:选择一个特定的窗函数,并使用该窗函数来设计滤波器系数。- Parks-McClellan算法:使用最小最大误差准则来设计滤波器系数。- Remez交错最小二乘法:使用迭代方法来设计滤波器系数。
下面是一个简单的Java代码示例,展示了如何使用Parks-McClellan算法来设计20阶低通FIR滤波器:
public class FIRFilter {<!-- -->private double[] b; // FIR filter coefficientsprivate double[] x; // input bufferprivate int pos; // current position in input bufferpublic FIRFilter(double[] b) {<!-- -->this.b = b;this.x = new double[b.length];this.pos = 0;}public double filter(double input) {<!-- -->x[pos] = input;double output = 0;for (int i = 0; i < b.length; i++) {<!-- -->output += b[i] * x[(pos + b.length - i) % b.length];}pos = (pos + 1) % b.length;return output;}public static double[] designLowPassFilter(int M, double fc) {<!-- -->int N = 2 * M + 1;double[] bands = {<!-- -->0, fc, fc + 0.1, 0.5};double[] desired = {<!-- -->1, 0};FIRFilterDesign design = new FIRFilterDesign();design.setFilterType(FIRFilterDesign.FilterType.BANDPASS);design.setWindowType(FIRFilterDesign.WindowType.KAISER);design.setNumTaps(N);design.setBandEdges(bands);design.setDesiredResponse(desired);double[] b = design.design();return b;}public static void main(String[] args) {<!-- -->int M = 10;double fc = 0.4;double[] b = designLowPassFilter(M, fc);FIRFilter filter = new FIRFilter(b);double[] input = {<!-- -->0.5, 0.6, 0.7, 0.8, 0.9};for (double x : input) {<!-- -->System.out.printf("%.3f ", filter.filter(x));}}
}
4. 无限脉冲响应(IIR)滤波器的优化
IIR滤波器的性能取决于其极点和零点的位置,因此可以通过优化极点和零点的位置来提高其性能。常见的优化方法包括:
- 极点优化法:通过最小化最大误差来确定极点的位置。- 零极点双线性变换法:将连续时间滤波器转换为离散时间滤波器,并使零点和极点保持不变,以提高滤波器性能。
下面是一个简单的Java代码示例,展示了如何使用极点优化法来设计一阶低通IIR滤波器:
public class IIRFilter {<!-- -->private double a; // IIR filter coefficientprivate double b; // IIR filter coefficientprivate double yPrev; // previous output valuepublic IIRFilter(double a, double b) {<!-- -->this.a = a;this.b = b;this.yPrev = 0;}public double filter(double input) {<!-- -->double output = b * input + a * yPrev;yPrev = output;return output;}public static double[] optimizePole(double fc) {<!-- -->double omegaC = 2 * Math.PI * fc;double T = 1;double thetaP = 0.5 * (-Math.cos(omegaC * T / 2) + Math.sqrt(Math.pow(Math.cos(omegaC * T / 2), 2) - 1));double real = -Math.log(0.01) / (T * thetaP);double imag = Math.sqrt(1 - Math.pow(real, 2));double[] pole = {<!-- -->-real, imag};return pole;}public static void main(String[] args) {<!-- -->double fc = 0.4;double[] pole = optimizePole(fc);double a = -pole[0];double b = (1 - Math.exp(-pole[0])) / (1 + Math.exp(-pole[0]));IIRFilter filter = new IIRFilter(a, b);double[] input = {<!-- -->0.5, 0.6, 0.7, 0.8, 0.9};for (double x : input) {<!-- -->System.out.printf("%.3f ", filter.filter(x));}}
}
以上是有限脉冲响应(FIR)和无限脉冲响应(IIR)滤波器的概念、Java代码实现以及优化方法。需要注意的是,在实际应用中,滤波器的设计和优化通常需要考虑多个因素,并进行综合分析和评估。
数字滤波器的稳定性
掌握数字滤波器的稳定性判断方法。 数字滤波器的稳定性是指输入信号有限时,输出信号是否有界。如果输出信号有界,则滤波器是稳定的;否则,滤波器是不稳定的。数字滤波器的稳定性判断方法包括两种:极点分布法和频率响应法。
1. 极点分布法
根据数字滤波器的传递函数,可以求出其所有极点及其在复平面内的位置。如果所有极点都位于单位圆内或左半个复平面,则滤波器是稳定的;否则,滤波器是不稳定的。下面是一个简单的Java代码示例,演示如何利用极点分布法判断数字滤波器的稳定性:
public class FilterStability {<!-- -->public static boolean isStable(double[] a) {<!-- -->Complex[] poles = PolynomialUtils.findRoots(a);for (Complex pole : poles) {<!-- -->if (pole.abs() >= 1) {<!-- -->return false;}}return true;}public static void main(String[] args) {<!-- -->double[] a = {<!-- -->1, -1.5, 0.7};boolean stable = isStable(a);System.out.println(stable ? "Stable" : "Unstable");}
}
2. 频率响应法
对于任意数字滤波器,其稳定性可以通过检查其频率响应是否满足BIBO(Bounded-Input, Bounded-Output)条件来判断。如果数字滤波器的频率响应有限,则它是一个稳定的滤波器;否则,它是不稳定的。下面是一个简单的Java代码示例,演示如何利用频率响应法判断数字滤波器的稳定性:
public class FilterStability {<!-- -->public static boolean isStable(double[] b, double[] a) {<!-- -->int N = 100;double[] H = new double[N];for (int i = 0; i < N; i++) {<!-- -->double w = Math.PI * i / N;Complex z = new Complex(Math.cos(w), Math.sin(w));Complex Hz = PolynomialUtils.evaluate(b, z).divide(PolynomialUtils.evaluate(a, z));H[i] = Hz.abs();}double maxH = DoubleStream.of(H).max().getAsDouble();return maxH < Double.POSITIVE_INFINITY;}public static void main(String[] args) {<!-- -->double[] b = {<!-- -->0.1, 0.2, 0.3, 0.4};double[] a = {<!-- -->1, -0.5, 0.25};boolean stable = isStable(b, a);System.out.println(stable ? "Stable" : "Unstable");}
}
以上是数字滤波器的稳定性判断方法及其在Java中的实现。需要注意的是,这两种方法仅适用于线性时不变系统,对于其他类型的数字滤波器如非线性系统、时变系统等,还需要使用其他方法来判断其稳定性。
滤波器的性能评价
学习滤波器的性能评价方法,包括幅频特性曲线、相频特性曲线和群延迟曲线等。 滤波器的性能评价通常包括幅频特性曲线、相频特性曲线和群延迟曲线等。这些曲线可以帮助我们了解滤波器在不同频率下的频率响应特性,以及其对输入信号的影响。
1. 幅频特性曲线
幅频特性曲线是指滤波器的输出信号幅度与输入信号幅度之比随着频率变化的曲线。通常使用dB(分贝)单位来表示幅度比,因为dB具有对数特性,便于比较不同频率下的幅度响应。下面是一个简单的Java代码示例,展示如何绘制幅频特性曲线:
public class AmplitudeResponse {<!-- -->public static double[] amplitudeResponse(double[] b, double[] a, int N) {<!-- -->double[] H = new double[N];for (int i = 0; i < N; i++) {<!-- -->double w = Math.PI * i / N;Complex z = new Complex(Math.cos(w), Math.sin(w));Complex Hz = PolynomialUtils.evaluate(b, z).divide(PolynomialUtils.evaluate(a, z));H[i] = 20 * Math.log10(Hz.abs());}return H;}public static void main(String[] args) {<!-- -->double[] b = {<!-- -->1, -0.5};double[] a = {<!-- -->1, -0.8};int N = 100;double[] H = amplitudeResponse(b, a, N);for (int i = 0; i < N; i++) {<!-- -->double w = Math.PI * i / N;System.out.printf("%.3f %.3f\n", w, H[i]);}}
}
2. 相频特性曲线
相频特性曲线是指滤波器的输出信号相位与输入信号相位之差随着频率变化的曲线。相位响应通常用角度单位来表示,例如弧度或度数。下面是一个简单的Java代码示例,展示如何绘制相频特性曲线:
public class PhaseResponse {<!-- -->public static double[] phaseResponse(double[] b, double[] a, int N) {<!-- -->double[] Phi = new double[N];for (int i = 0; i < N; i++) {<!-- -->double w = Math.PI * i / N;Complex z = new Complex(Math.cos(w), Math.sin(w));Complex Hz = PolynomialUtils.evaluate(b, z).divide(PolynomialUtils.evaluate(a, z));Phi[i] = Hz.getArgument();}return Phi;}public static void main(String[] args) {<!-- -->double[] b = {<!-- -->1, -0.5};double[] a = {<!-- -->1, -0.8};int N = 100;double[] Phi = phaseResponse(b, a, N);for (int i = 0; i < N; i++) {<!-- -->double w = Math.PI * i / N;System.out.printf("%.3f %.3f\n", w, Phi[i]);}}
}
3. 群延迟曲线
群延迟曲线是指滤波器对不同频率的输入信号引起的信号延迟随着频率变化的曲线。群延迟是指信号在经过滤波器后的延迟时间与理想情况下通过相同滤波器所引起的延迟时间之间的差异。群延迟通常用时间单位来表示,例如秒或毫秒。下面是一个简单的Java代码示例,展示如何绘制群延迟曲线:
public class GroupDelay {<!-- -->public static double[] groupDelay(double[] b, double[] a, int N) {<!-- -->double[] H = new double[N];for (int i = 0; i < N; i++) {<!-- -->double w = Math.PI * i / N;Complex z = new Complex(Math.cos(w), Math.sin(w));Complex Hz = PolynomialUtils.evaluate(b, z).divide(PolynomialUtils.evaluate(a, z));H[i] = -z.multiply(PolynomialUtils.differentiate(PolynomialUtils.log(Hz))).getReal();}return H;}public static void main(String[] args) {<!-- -->double[] b = {<!-- -->1, -0.5};double[] a = {<!-- -->1, -0.8};int N = 100;double[] G = groupDelay(b, a, N);for (int i = 0; i < N; i++) {<!-- -->double w = Math.PI * i / N;System.out.printf("%.3f %.3f\n", w, G[i]);}}
}
以上是滤波器的性能评价方法及其在Java中的实现。需要注意的是,这些曲线的绘制可能需要使用一些第三方库来辅助实现,例如Apache Commons Math、JFreeChart等。同时,在进行滤波器性能评价时,还需要考虑其他因素,例如滤波器的阶数、截止频率等,以综合评估滤波器的性能。
实际应用
了解滤波器在实际应用中的常见场景,如音频处理、图像处理、通信系统和控制系统等方面的应用。 滤波器在实际应用中广泛存在,涉及到许多领域,包括音频处理、图像处理、通信系统和控制系统等。下面简要介绍这些方面的应用,并给出相应的Java代码示例。
1. 音频处理
音频处理是指对声音信号进行处理的过程,常见应用包括音频增强、降噪、均衡等。滤波器在音频处理中广泛使用,例如高通滤波器可以用于去除低频噪声,低通滤波器可以用于去除高频噪声。下面是一个简单的Java代码示例,展示如何利用滤波器进行音频降噪:
public class AudioProcessor {<!-- -->public static void main(String[] args) throws UnsupportedAudioFileException, IOException {<!-- -->File input = new File("input.wav");AudioInputStream in = AudioSystem.getAudioInputStream(input);AudioFormat format = in.getFormat();int channels = format.getChannels();int sampleRate = (int)format.getSampleRate();double cutoffFrequency = 1000;double[] b = {<!-- -->1};double[] a = FilterDesign.designLowpassFilter(cutoffFrequency / sampleRate);IIRFilter filter = new IIRFilter(a, b);byte[] buffer = new byte[4096];ByteArrayOutputStream out = new ByteArrayOutputStream();int n = 0;while ((n = in.read(buffer)) != -1) {<!-- -->for (int i = 0; i < n; i += 2) {<!-- -->double x = (buffer[i] & 0xff) | ((buffer[i + 1] & 0xff) << 8);for (int j = 0; j < channels; j++) {<!-- -->double y = filter.filter(x);buffer[i + j * 2] = (byte)(y & 0xff);buffer[i + j * 2 + 1] = (byte)((y >> 8) & 0xff);}}out.write(buffer, 0, n);}in.close();byte[] audioData = out.toByteArray();File output = new File("output.wav");AudioSystem.write(new AudioInputStream(new ByteArrayInputStream(audioData), format, audioData.length), AudioFileFormat.Type.WAVE, output);}
}
2. 图像处理
滤波器在图像处理中也经常用于去除噪声、平滑轮廓等操作。常见的滤波器包括均值滤波器、高斯滤波器、中值滤波器等。下面是一个简单的Java代码示例,展示如何利用滤波器进行图像平滑处理:
public class ImageProcessor {<!-- -->public static BufferedImage smooth(BufferedImage image, int kernelSize) {<!-- -->int width = image.getWidth();int height = image.getHeight();BufferedImage result = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);int[][] kernel = createGaussianKernel(kernelSize);int k = kernelSize / 2;for (int i = k; i < width - k; i++) {<!-- -->for (int j = k; j < height - k; j++) {<!-- -->int rSum = 0, gSum = 0, bSum = 0;for (int u = -k; u <= k; u++) {<!-- -->for (int v = -k; v <= k; v++) {<!-- -->Color color = new Color(image.getRGB(i + u, j + v));int kernelValue = kernel[k + u][k + v];rSum += kernelValue * color.getRed();gSum += kernelValue * color.getGreen();bSum += kernelValue * color.getBlue();}}int r = rSum / kernelSize / kernelSize;int g = gSum / kernelSize / kernelSize;int b = bSum / kernelSize / kernelSize;result.setRGB(i, j, new Color(r, g, b).getRGB());}}return result;}private static int[][] createGaussianKernel(int size) {<!-- -->double sigma = size / 6.0;int k = size / 2 int[][] kernel = new int[size][size];double sum = 0;for (int i = 0; i < size; i++) {<!-- -->for (int j = 0; j < size; j++) {<!-- -->double x = i - k, y = j - k;double value = Math.exp(-(x * x + y * y) / (2 * sigma * sigma));kernel[i][j] = (int)Math.round(value * 255);sum += kernel[i][j];}}for (int i = 0; i < size; i++) {<!-- -->for (int j = 0; j < size; j++) {<!-- -->kernel[i][j] = (int)Math.round(kernel[i][j] / sum);}}return kernel;}public static void main(String[] args) throws IOException {<!-- -->BufferedImage image = ImageIO.read(new File("input.jpg"));BufferedImage result = smooth(image, 5);ImageIO.write(result, "jpg", new File("output.jpg"));}
}
3. 通信系统
滤波器在通信系统中的应用非常广泛,例如用于解调、解码、降噪等操作。常见的滤波器包括低通滤波器、带通滤波器、高通滤波器等。下面是一个简单的Java代码示例,展示如何利用滤波器进行数字信号解调:
public class Demodulator {<!-- -->public static byte[] demodulate(byte[] signal, int sampleRate, double carrierFrequency) {<!-- -->double[] t = new double[signal.length / 2];double[] x = new double[t.length];for (int i = 0; i < t.length; i++) {<!-- -->t[i] = i * 1.0 / sampleRate;x[i] = (signal[i * 2] & 0xff) * Math.cos(2 * Math.PI * carrierFrequency * t[i]) - (signal[i * 2 + 1] & 0xff) * Math.sin(2 * Math.PI * carrierFrequency * t[i]);}double cutoffFrequency = 2000;double[] b = {<!-- -->1, -1};double[] a = FilterDesign.designHighpassFilter(cutoffFrequency / sampleRate);IIRFilter filter = new IIRFilter(a, b);byte[] result = new byte[x.length];for (int i = 0; i < x.length; i++) {<!-- -->double y = filter.filter(x[i]);result[i] = (byte)(y + 128);}return result;}public static void main(String[] args) throws IOException {<!-- -->byte[] signal = Files.readAllBytes(new File("signal.raw").toPath());int sampleRate = 44100;double carrierFrequency = 1000;byte[] data = demodulate(signal, sampleRate, carrierFrequency);FileOutputStream out = new FileOutputStream(new File("output.raw"));out.write(data);out.close();}
}
4. 控制系统
滤波器在控制系统中的应用也非常广泛,例如用于去除干扰、提取信号等操作。常见的滤波器包括带阻滤波器、陷波滤波器、低通滤波器等。下面是一个简单的Java代码示例,展示如何利用滤波器进行控制系统中的信号处理:
public class SignalProcessor {<!-- -->public static void main(String[] args) {<!-- -->double[] signal = {<!-- -->0.5, 1.2, 1.8, 2.5, 3.2, 4.1, 4.8, 5.5, 6.2, 6.9};double[] b = {<!-- -->1, -1};double[] a = {<!-- -->1, -0.8};IIRFilter filter = new IIRFilter(a, b);for (int i = 0; i < signal.length; i++) {<!-- -->double y = filter.filter(signal[i]);System.out.printf("%.2f %.2f\n", signal[i], y);}}
}
以上是滤波器在实际应用中的常见场景及其在Java中的实现,在控制系统中,我们还可以通过MATLAB和Simulink来进行更加高级的滤波器设计与应用。例如,下面是一个MATLAB代码示例,展示如何利用MATLAB进行带通滤波器设计:
fs = 1000; % 采样频率
f1 = 50; f2 = 150; % 带通频率范围
[b, a] = butter(5, [f1, f2]/(fs/2), 'bandpass'); % 设计带通滤波器
freqz(b, a); % 绘制幅度响应曲线
上述代码中,我们使用了MATLAB提供的butter函数,该函数可以根据指定的阶数和截止频率范围来设计滤波器系数。接着,我们使用freqz函数绘制了滤波器的幅度响应曲线。
与此类似,我们还可以利用Simulink进行滤波器的建模和仿真。例如,下面是一个简单的Simulink模型示例,展示了如何利用Simulink对音频信号进行低通滤波处理:
![在这里插入图片描述](https://img-blog.csdnimg.cn/b7528872c3064c0f9a579a62cec0ddba.png)
上述模型中,我们将输入音频信号通过一个低通滤波器进行处理,然后输出处理结果。在模型中,我们使用了Simulink提供的IIR Filter模块来实现低通滤波器,该模块可以根据指定的系数来进行滤波处理。在模拟过程中,我们可以对输入信号进行调整,观察滤波器的效果。
综上所述,滤波器在实际应用中有着广泛的应用场景,在不同的领域中都有不同的具体实现方式。通过掌握滤波器的基本概念和常见设计方法,以及利用MATLAB、Simulink等工具来进行高级应用,可以帮助我们更好地理解和应用滤波器。
高级主题
深入研究自适应滤波、多速率信号处理、小波变换和滤波器组等高级主题。
1. 自适应滤波
自适应滤波是一种能够根据输入信号的特性动态调整滤波器系数的滤波方法。它可以用于去除不同类型的噪声、提取难以分辨的信号等。常见的自适应滤波算法包括LMS算法和RLS算法。下面是一个简单的Java代码示例,展示如何利用LMS算法进行自适应滤波:
public class AdaptiveFilter {<!-- -->public static double[] lmsFilter(double[] input, double[] desired, int order, double mu) {<!-- -->double[] weights = new double[order];double[] output = new double[input.length];for (int i = 0; i < input.length; i++) {<!-- -->double y = 0;for (int j = 0; j < order; j++) {<!-- -->y += weights[j] * input[i - j];}output[i] = y;double error = desired[i] - y;for (int j = 0; j < order; j++) {<!-- -->weights[j] += mu * error * input[i - j];}}return output;}public static void main(String[] args) {<!-- -->double[] input = {<!-- -->1, -0.5, 0.2, -0.1, -0.3, 0.4, -0.6, 0.7, -0.8, 0.9};double[] noise = {<!-- -->0.1, -0.2, 0.3, -0.4, 0.5, -0.6, 0.7, -0.8, 0.9, -1};double[] desired = new double[input.length];for (int i = 0; i < input.length; i++) {<!-- -->desired[i] = input[i] + noise[i];}int order = 3;double mu = 0.05;double[] output = lmsFilter(input, desired, order, mu);System.out.println(Arrays.toString(output));}
}
2. 多速率信号处理
多速率信号处理是指对信号进行分带、抽取、插值等操作,以便于进行不同频率范围的处理。常见的多速率信号处理方法包括多解析度分析、数字滤波器组等。下面是一个简单的Java代码示例,展示如何利用数字滤波器组进行多速率信号处理:
public class MultirateSignalProcessing {<!-- -->public static double[] resample(double[] signal, int inRate, int outRate) {<!-- -->double[] result = new double[signal.length * outRate / inRate];double factor = (double)inRate / outRate;FIRFilter filter = FilterDesign.designLowpassFilter(0.45 / factor);int k = filter.size() / 2;for (int i = 0; i < result.length; i++) {<!-- -->double t = i * factor;int index = (int)Math.round(t);double sum = 0;for (int j = -k; j <= k; j++) {<!-- -->if (index + j >= 0 && index + j < signal.length) {<!-- -->sum += filter.get(j + k) * signal[index + j];}}result[i] = sum;}return result;}public static void main(String[] args) {<!-- -->int inRate = 44100;int outRate = 22050;double[] signal = new double[inRate];for (int i = 0; i < signal.length; i++) {<!-- -->signal[i] = Math.sin(2 * Math.PI * 1000 * i / inRate);}double[] resampledSignal = resample(signal, inRate, outRate);System.out.println(Arrays.toString(resampledSignal));}
}
3. 小波变换
小波变换是一种能够在时域和频域之间进行转换的信号处理方法,它可以捕获信号的瞬时特性和局部特征。常见的小波变换包括离散小波变换和连续小波变换。下面是一个简单的Java代码示例,展示如何利用JWave库进行小波变换:
import jwave.Transform;
import jwave.transforms.FastWaveletTransform;
import jwave.transforms.wavelets.haar.Haar1;public class WaveletTransform {<!-- -->public static double[] waveletTransform(double[] signal) {<!-- -->Transform transform = new FastWaveletTransform(new Haar1());double[] coefficients = transform.forward(signal);return coefficients;}public static double[] inverseWaveletTransform(double[] coefficients) {<!-- -->Transform transform = new FastWaveletTransform(new Haar1());double[] signal = transform.reverse(coefficients);return signal;}public static void main(String[] args) {<!-- -->double[] signal = {<!-- -->0.5, 1.2, 1.8, 2.5, 3.2, 4.1, 4.8, 5.5};double[] coefficients = waveletTransform(signal);System.out.println(Arrays.toString(coefficients));double[] reconstructedSignal = inverseWaveletTransform(coefficients);System.out.println(Arrays.toString(reconstructedSignal));}
}
4. 滤波器组
滤波器组是由多个滤波器组合而成的信号处理方法,常用于对不同频率范围的信号进行分离、分析等操作。常见的滤波器组包括小波变换滤波器组、多相滤波器组等。下面是一个简单的Java代码示例,展示如何利用多相滤波器组进行信号分离:
public class FilterBank {<!-- -->public static double[][] filterBank(double[] signal, FIRFilter[] filters) {<!-- -->double[][] output = new double[filters.length][signal.length];int k = filters[0].size() / 2;for (int i = 0; i < filters.length; i++) {<!-- -->FIRFilter filter = filters[i];for (int j = 0; j < signal.length; j++) {<!-- -->double sum = 0;for (int l = -k; l <= k; l++) {<!-- -->if (j + l >= 0 && j + l < signal.length) {<!-- -->sum += filter.get(l + k) * signal[j + l];}}output[i][j] = sum;}}return output;}public static void main(String[] args) {<!-- -->double[] signal = {<!-- -->0.5, 1.2, 1.8, 2.5, 3.2, 4.1, 4.8, 5.5};FIRFilter[] filters = FilterDesign.designBandpassFilters(new double[]{<!-- -->0.3, 0.6}, new double[]{<!-- -->0.05, 0.1}, 10);double[][] output = filterBank(signal, filters);for (int i = 0; i < filters.length; i++) {<!-- -->System.out.println(Arrays.toString(output[i]));}}
}
以上是自适应滤波、多速率信号处理、小波变换和滤波器组等高级主题的概念及其在Java中的简单实现。这些主题涵盖了信号处理中的许多高级应用,通过深入研究这些主题,可以进一步提升我们的信号处理技能。
监听器
JavaWeb监听器是一种能够在特定事件发生时自动执行相应代码的组件。它可以用于监听Web应用程序的生命周期、会话状态变化、请求和响应等事件,以便于进行一些预处理或后续处理。下面是JavaWeb监听器的概念及其在Java中的详细实现。
1. 概念
JavaWeb监听器是一组Java类,它们能够监听特定事件(如Servlet的生命周期、Session的创建和销毁、ServletContext属性的修改等)并在事件发生时执行相应的代码。
监听器通常包含三个部分:事件源、事件监听器和事件处理器。事件源表示被监听的对象;事件监听器是一个实现了特定接口的Java类,用于接收和处理事件;事件处理器则是在事件监听器中定义的方法,用于对接收到的事件进行处理。
JavaWeb监听器主要有以下几种类型:
- ServletContextListener:用于监听ServletContext的生命周期事件,如ServletContext的创建和销毁。- ServletRequestListener和ServletRequestAttributeListener:用于监听HttpServletRequest的生命周期事件,如ServletRequest的创建和销毁,以及ServletRequest中属性的修改。- HttpSessionListener和HttpSessionAttributeListener:用于监听HttpSession的生命周期事件,如HttpSession的创建和销毁,以及HttpSession中属性的修改。
2. Java代码详解
下面是一个简单的JavaWeb监听器的示例,展示如何使用ServletContextListener监听ServletContext的生命周期事件:
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;public class MyServletContextListener implements ServletContextListener {<!-- -->public void contextInitialized(ServletContextEvent event) {<!-- -->System.out.println("ServletContext创建");}public void contextDestroyed(ServletContextEvent event) {<!-- -->System.out.println("ServletContext销毁");}
}
在上述示例中,我们定义了一个MyServletContextListener类,并实现了ServletContextListener接口。其中的contextInitialized和contextDestroyed方法分别对应ServletContext的创建和销毁事件,它们会在相应事件发生时自动被调用。
接下来,在web.xml文件中配置监听器:
<listener><listener-class>MyServletContextListener</listener-class>
</listener>
这样,在应用程序启动时,就会自动创建一个ServletContext对象,并触发MyServletContextListener的contextInitialized方法;而在应用程序关闭时,就会自动销毁ServletContext对象,并触发MyServletContextListener的contextDestroyed方法。
除了ServletContextListener外,其他类型的监听器也可以通过类似的方式进行配置。
总之,JavaWeb监听器是一种能够自动监听特定事件并执行相应代码的组件,它可以用于监听Web应用程序的生命周期、会话状态变化、请求和响应等事件,以便于进行一些预处理或后续处理。
Ajax
Ajax(Asynchronous JavaScript and XML)是一种在Web页面上异步加载数据的技术,通过JavaScript和XMLHttpRequest对象实现。它可以使Web应用程序更加流畅地响应用户操作,而无需刷新整个页面。
1. 实现原理
Ajax的实现原理主要包括以下几个步骤:
- 在Web页面中,使用JavaScript创建XMLHttpRequest对象。- 使用XMLHttpRequest对象向服务器发送HTTP请求,并指定要获取的数据类型(如文本、XML、JSON等)以及请求参数。- 服务器端接收到请求后,处理请求并将结果以指定的数据类型返回给客户端。- 客户端接收到服务器返回的数据后,使用JavaScript对页面进行动态更新,无需刷新整个页面。
2. 优点
与传统的Web页面相比,Ajax技术具有以下几个优点:
- 提高了用户体验。使用Ajax技术能够使Web应用程序更加流畅地响应用户操作,提高了用户体验。- 减少了网络带宽的占用。由于Ajax可以部分更新Web页面,因此减少了不必要的数据传输,降低了网络带宽的占用。- 提高了Web应用程序的性能。使用Ajax可以避免重复加载Web页面,减少不必要的服务器负荷,提高Web应用程序的性能。- 提高了代码的可维护性。使用Ajax技术可以让Web应用程序的代码更加简洁、清晰,提高了代码的可维护性。
3. 实现方式
Ajax技术可以使用原生的JavaScript实现,也可以使用常见的JavaScript库(如jQuery、Prototype等)来简化编码。下面是一个基于原生JavaScript实现的简单Ajax示例:
var xmlhttp;
if (window.XMLHttpRequest) {<!-- -->// IE7+、Firefox、Chrome、Opera、Safari支持XMLHttpRequest对象xmlhttp = new XMLHttpRequest();
} else {<!-- -->// IE6、IE5支持ActiveXObject对象xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
}xmlhttp.onreadystatechange = function() {<!-- -->if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {<!-- -->// 当readyState为4且status为200时,表示请求成功document.getElementById("myDiv").innerHTML = xmlhttp.responseText;}
}// 向服务器发送GET请求,并指定URL、异步标志为true
xmlhttp.open("GET", "ajax_info.txt", true);
xmlhttp.send();
在上述示例中,我们首先创建了一个XMLHttpRequest对象,并通过它向服务器发送了一个异步的GET请求。当服务器返回数据后,我们将其显示在名为"myDiv"的页面元素中。
4. 总结
Ajax是一种通过JavaScript和XMLHttpRequest对象实现异步加载数据的技术,能够提高Web应用程序的响应速度和用户体验。它可以使用原生的JavaScript实现,也可以使用常见的JavaScript库来简化编码。
相关文章:
![](https://img-blog.csdnimg.cn/b7528872c3064c0f9a579a62cec0ddba.png)
javaweb(四)——过滤器与监听器
文章目录 过滤器Filter基本概念滤波器的分类: 时域和频域表示滤波器类型1. 低通滤波器(Low-Pass Filter)2. 高通滤波器(High-Pass Filter)3. 带通滤波器(Band-Pass Filter)4. 带阻滤波器(Band-Stop Filter) 滤波器参数1. 通带频率(Passband Frequency)2. 截止频率(Cutoff Frequ…...
![](https://www.ngui.cc/images/no-images.jpg)
冗余电源的应用,哪些工作站支持冗余电源
冗余电源是一种通过多组电源模块进行备份的技术手段,采用热备插拔式设计,使备用电源在主要电源失效时自动启动,从而确保电源供应不间断。 冗余电源通常应用于对电力要求极高的关键设备和系统,如医疗设备、核电站、数据中心等。在…...
![](https://www.ngui.cc/images/no-images.jpg)
[信号与系统]IIR滤波器与FIR滤波器相位延迟定量的推导。
IIR滤波器与FIR滤波器最大的不同:相位延迟 IIR滤波器相位延迟分析 相位响应和延迟 这里讨论一下理想延迟系统的相位延迟。 对于一个给定的系统频率响应 H ( e j w ) H(e^{jw}) H(ejw)可以表示为 H ( e j w ) ∣ H ( e j w ) ∣ e Φ ( w ) H(e^{jw}) |H(e^{jw…...
![](https://img-blog.csdnimg.cn/img_convert/5c86b91496871443d3fddf1854b3ca0d.gif)
Python海量数据处理脚本大集合:pyWhat
pyWhat:精简海联数据,直达数据弱点要害- 精选真开源,释放新价值。 概览 pyWhat是Github社区上一款比较实用的开源Python脚本工具。它能够快速提取信息中的 IP 地址、邮箱、信用卡、数字货币钱包地址、YouTube 视频等内容。当你遇到了一串莫名…...
![](https://www.ngui.cc/images/no-images.jpg)
postgresql搭建
搭建postgresql-11.3,和客户端工具 1,准备对应的包,右键直接下一步安装完即可, 将postgresql设置为本地服务,方便启动, 2,用对应客户端软件连接,新建一个数据库controlDB 新建用户…...
![](https://www.ngui.cc/images/no-images.jpg)
Web 品质标准
Web 品质标准 引言 随着互联网的快速发展,Web应用已经渗透到我们生活的方方面面。为了确保Web应用的质量,提高用户体验,Web品质标准应运而生。这些标准涵盖了多个方面,包括性能、安全性、可访问性、用户体验等。本文将详细介绍这些标准,并探讨它们在实际开发中的应用。 …...
![](https://www.ngui.cc/images/no-images.jpg)
深入理解PyTorch:原理与使用指南
文章目录 引言一、PyTorch的原理1. 动态计算图2. 自动微分3. 张量计算4. 高效的并行计算 二、PyTorch的使用1. 环境配置2. 加载数据3. 构建模型4. 训练模型5. 验证和测试模型 三、PyTorch的安装与配置四、PyTorch的使用示例总结 引言 在深度学习和机器学习的广阔领域中&#x…...
![](https://img-blog.csdnimg.cn/direct/98a4b8e6e8234386a4022559bcaac9c7.png)
【MySQL事务】深刻理解事务隔离以及MVCC
文章目录 什么叫事务事务的提交方式常见的事务操作方式事务的开始与回滚总结 事务的隔离设置隔离级别解释脏读解释幻读解释不可重复读为什么可重复读不能解决幻读问题?总结 数据库并发的场景MVCC隐藏列字段undo日志Read view RR和RC的本质区别总结 什么叫事务 在My…...
![](https://img-blog.csdnimg.cn/direct/5da30103bd5c413e9353ddc3308b7a1d.png#pic_center)
关于Mac mini 10G网口的问题
问题: 购入一个10G网口的Mac mini M2,将其和自己的2.5G交换机连接,使用共享屏幕进行远程操作的过程中出现了频率极高的卡顿,几乎是几秒钟卡一下,使用ping进行测试发现卡的时候就ping不通了。测试使用Mac mini的无线网和雷电转2.5G…...
![](https://www.ngui.cc/images/no-images.jpg)
计算机网络-第4章 网络层
4.1网络层的几个重要概念 4.1.1网络层提供的两种服务 电信网面向连接通信方式,虚电路VC。 互联网设计思路:网络层要设计得尽量简单,向其上层只提供简单灵活的,尽最大努力交付的数据报服务。 网络层不提供服务质量的承诺&#…...
![](https://www.ngui.cc/images/no-images.jpg)
pytorch跑手写体实验
目录 1、环境条件 2、代码实现 3、总结 1、环境条件 pycharm编译器pytorch依赖matplotlib依赖numpy依赖等等 2、代码实现 import torch import torch.nn as nn import torch.optim as optim import torchvision import torchvision.transforms as transforms import matpl…...
![](https://www.ngui.cc/images/no-images.jpg)
利用Java的`java.util.concurrent`包优化多线程性能
利用Java的java.util.concurrent包优化多线程性能 一、引言 在Java的多线程编程中,性能优化是一个永恒的话题。随着多核CPU的普及和计算任务的日益复杂,多线程编程已经成为提高应用程序性能的重要手段。然而,多线程编程也带来了一系列的问题…...
![](https://img-blog.csdnimg.cn/img_convert/c757425c8c427d8eb79b976e17559c71.png)
软件著作权申请:开发者的重要保障与助力
一、引言 随着信息技术的飞速发展,软件产业已成为推动经济增长的重要动力。然而,在软件开发过程中,保护创作者的权益、防止抄袭和侵权行为显得尤为重要。软件著作权作为保护软件开发者权益的重要法律工具,其申请和登记流程对于软…...
![](https://www.ngui.cc/images/no-images.jpg)
WLAN Hostapd配置参数详解 - CN
想必大家平台在调试Hostapd时,针对某些特殊的参数,很难一下子理清楚其用法,这里对hostapd使用的配置参数进行一个归纳,以供大家参考( 其英文参考为:WLAN Hostapd配置参数详解 - EN-CSDN博客)&am…...
![](https://i-blog.csdnimg.cn/direct/50cfda1532ab47eeb27147ab6df43dd6.png)
Excel 宏录制与VBA编程 ——VBA编程技巧篇一 (Union方法、Resize方法、Cells方法、UseSelect方法、With用法)
Uniom方法 使用Union方法可以将多个非连续区域连接起来成为一个区域,从而可以实现对多个非连续区域一起进行操作。 Resize方法 使用Range对象的Resize属性调整指定区域的大小,并返回调整大小后的单元格区域。 Cells方法 Cells属性返回一个Range对象。 Us…...
![](https://img-blog.csdnimg.cn/direct/1e9fab53a1904fe1a2e5651c4ddbea72.png)
基于路径长度的样条插补算法(自动驾驶和路径跟踪控制适用)
以前在做车辆跟踪控制的时候发现在针对有多个X和多个Y对应的路径插补时候,总是报错,因为MATLAB里面的interp1插补函数它要求x要唯一对应一个y,当路径以单独的x或者y来求插补时候的时候就报错。由于在使用Matlab的interp1函数进行插值时&#…...
![](https://img-blog.csdnimg.cn/direct/e046e10a5c234ce0829e79965d4c16d9.png)
net Framework OAuth2.0
grant_type client_credentials 客户端凭证password 密码模式 用于资源所有者密码凭据token 隐藏式 、 简化式 简化模式又称为隐式授权码模式,它是授权码模式的一个简化版本authorization_code 授权码 A. 第三方程序向资源拥有者(用户)发送授权请求…...
![](https://www.ngui.cc/images/no-images.jpg)
速盾:服务器cdn加速超时如何解决?
CDN(Content Delivery Network,内容分发网络)是一种将网站内容分布到全球各地服务器上的技术,以提高网站的访问速度和用户体验。然而,在使用CDN时,有时候会遇到服务器CDN加速超时的问题,即CDN服…...
![](https://img-blog.csdnimg.cn/direct/d895484e62814de9be8cf2b02c85b783.png)
2024年6月总结及随笔之打卡网红点
1. 回头看 日更坚持了547天。 读《人工智能时代与人类未来》更新完成读《AI未来进行式》开更并更新完成读《AI新生:破解人机共存密码》开更并持续更新 2023年至2024年6月底累计码字1267912字,累计日均码字2317字。 2024年6月码字90659字,…...
![](https://img-blog.csdnimg.cn/direct/37025a44aabd46c9ac9d672a65e0cfc2.png)
《Windows API每日一练》7.4 状态报告上使用计时器
这一节我们使用计时器,每隔一秒获取当前鼠标坐标位置的像素值,并显示在窗口,这就相当于是一个简单的取色器了。 本节必须掌握的知识点: 第47练:取色器 7.4.1 第47练:取色器 /*----------------------------…...
![](https://www.ngui.cc/images/no-images.jpg)
python实现API调用缓存
python实现API调用缓存 1.代码2.输出3.保存的json数据 想把python某些函数的参数及返回值记录下来,如果之前已计算过,则直接返回缓存中的数据 1.代码 import jsondef get_variable_name(var):变量转变量名local_varsglobals()return [name for name, value in local_vars.ite…...
![](https://img-blog.csdnimg.cn/direct/cf06a9778d984c6fb54306729f40994d.png)
传输距离3000M|低延迟|48K采样音频传输模块-SA356大功率发射模块
无线音频应用中,远距离音频传输在许多领域具有广泛的应用需求,例如大型会议系统、公共广播、户外活动和音乐演出等。为了满足这些需求,音频传输模块需要具备一些关键特性,包括长距离传输能力、高音质、低延迟、稳定性以及抗干扰能…...
![](https://www.ngui.cc/images/no-images.jpg)
前端css性能优化
前端css性能优化 1. 减少样式表数量和压缩文件大小: 通过合并多个样式表、删除未使用的样式、压缩样式表等方式来减少样式表数量和大小,从而减少网络请求和提高加载速度。 通常来说,样式文件会被浏览器缓存,进入到其他页面样式文件…...
![](https://www.ngui.cc/images/no-images.jpg)
如何在Windows上使用Docker搭建PHP开发环境
前言 在本地搭建开发环境我好像没几年就要折腾一次,因为本地开发电脑使用的是windows,早些年的时候,用过很多类似WAMP之类的东西,但最终都有或多或少不满意的地方,前两年的时候,还折腾过WSL,但…...
![](https://www.ngui.cc/images/no-images.jpg)
java 单例模式
Java中实现单例模式的常见方式有两种:懒汉式和饿汉式。以下是这两种方式的简单示例: 饿汉式 饿汉式单例模式在类加载时就完成了实例的初始化,以空间换时间,确保了实例的唯一性。 public class Singleton {// 在自己内部定义自己…...
![](https://www.ngui.cc/images/no-images.jpg)
爬虫 属性 方法
在Python中,爬虫常用于从网页上抓取数据。BeautifulSoup是一个流行的库,用于从HTML或XML文件中提取数据。它创建了一个解析树,方便你从文档中查找、修改或导航数据。 安装BeautifulSoup 首先,你需要安装BeautifulSoup和lxml&…...
![](https://img-blog.csdnimg.cn/direct/b0d89b094c0e4b578e3398fb32fdeede.png)
HEX文件
什么是hex文件 以*.hex为后缀的文件我们称之为HEX文件。hex是intel规定的标准,hex的全称是Intel HEX,此类文件通常用于传输将被存于ROM或EEPROM中的程序和数据。是由一行行符合Intel HEX文件格式的文本所构成的ASCII文本文件。HEX的英语原始意思是16进制…...
![](https://www.ngui.cc/images/no-images.jpg)
人机融合的智能操作系统
操作系统(Operating System,简称 OS)是管理计算机硬件与软件资源的系统软件,同时也是计算机系统的内核与基石。它的职责常包括对硬件的直接监管、对各种计算资源(如内存、处理器时间等)的管理、以及提供诸如…...
![](https://img-blog.csdnimg.cn/direct/0048c6cb21d1466799144b1433a3e205.png)
数据结构之二叉树概念
数据结构之二叉树 二叉树简介分类普通二叉树平衡二叉树满二叉树二叉搜索树(二叉排序树、二叉查找树),平衡二叉树红黑树 B树类型B树(B-树、B_树)B树B*树 二叉树 简介 二叉树(Binary Tree) :是一种非常重要…...
![](https://img-blog.csdnimg.cn/img_convert/89718bfc45b6b2043019115fa94248b8.png)
Linux源码阅读笔记08-进程调度API系统调用案例分析
kthread_create_on_node kthread_create_on_node函数功能:指定存储节点创建新内核线程。源码如下: 操作实战 #include <linux/module.h> #include <linux/pid.h> #include <linux/sched.h> #include <linux/kthread.h> #inclu…...
![](https://img-blog.csdnimg.cn/img_convert/e0f1f65907fe752e1d3ac8ed675a86e7.jpeg)
短视频抓取:成都柏煜文化传媒有限公司
短视频抓取:技术挑战、法律边界与未来趋势 随着移动互联网的迅猛发展,短视频平台如雨后春笋般涌现,成为现代人生活娱乐的重要组成部分。然而,在海量短视频内容中,如何高效、准确地抓取目标视频,成为了一个…...
![](https://www.ngui.cc/images/no-images.jpg)
proto的前后端使用
首先定义一个input.proto文件 内容如下 syntax "proto3";message InputData {int32 UserId 1; // 将 number 改为 int32 或 int64string UserInput 2;string DrunkState 3; }message ResponseData {string AIResponse 1;string prompt 2;string emoti…...
![](https://img-blog.csdnimg.cn/img_convert/77cbf51156f2e005949342d89664c095.jpeg)
华为解决固态硬盘致命弱点:延长30~50%的SSD寿命
如今的SSD容量越做越大,企业级SSD容量已达30TB、60TB的、甚至120TB。但SSD寿命一直是“致命伤”,越大容量的盘,出现故障后,丢失的数据就越多。 近日, 华为数据存储发文,揭开华为全闪分布式存储让SSD大盘更“…...
![](https://www.ngui.cc/images/no-images.jpg)
登录验证码高扩展性设计方案
登录验证码高扩展性建设方案 本文分享了一种登录验证码高扩展性的建设方案,通过工厂模式策略模式,增强了验证码服务中验证码生成器、验证码存储器、验证码图片生成器的扩展性,实现了服务组件的多样化,降低了维护成本 登录验证码高…...
![](https://www.ngui.cc/images/no-images.jpg)
Spring MVC数据绑定和响应——数据回写(一)普通字符串的回写
接下来通过HttpServletResponse输出数据的案例,演示普通字符串的回写,案例具体实现步骤如下。 1、创建一个数据回写类DataController,在DataController类中定义showDataByResponse()方法,用于测试在Spring MVC中普通字符串的回写…...
![](https://www.ngui.cc/images/no-images.jpg)
怎样才能更好地保护个人账号的安全
怎样才能更好地保护个人账号的安全 保护个人账号安全是网络安全的重要组成部分,以下是一些有效的措施来增强账号的安全性: 1. 使用强密码 复杂性:创建包含大小写字母、数字和特殊字符的密码。长度:密码至少应有12个字符长。唯一…...
![](https://www.ngui.cc/images/no-images.jpg)
react native优质开源项目
React Native 是一个非常流行的用于构建跨平台移动应用程序的框架,开源社区贡献了许多优质的项目和库。以下是一些备受认可的 React Native 开源项目,适合用来学习和参考: ### 1. **React Native Elements** [React Native Elements](https:…...
![](https://www.ngui.cc/images/no-images.jpg)
速盾:海外cdn有哪些优缺点呢?
海外 CDN(内容分发网络)是一种通过在全球多个节点上分布内容来加速网站访问速度的服务。它通过将网站的静态内容缓存到全球各地的服务器上,使用户可以从最近的服务器获取内容,从而提高网站的响应速度和用户体验。然而,…...
![](https://img-blog.csdnimg.cn/direct/8811f2fd02164bdbbc4b81989fd26e31.png)
Unity Shader 软粒子
Unity Shader 软粒子 前言项目Shader连连看项目渲染管线设置 鸣谢 前言 当场景有点单调的时候,就需要一些粒子点缀,此时软粒子就可以发挥作用了。 使用软粒子与未使用软粒子对比图 项目 Shader连连看 这里插播一点,可以用Vertex Color与…...
![](https://img-blog.csdnimg.cn/direct/bda89959e3684bb49aa3e0051b65a048.png)
nextTick的应用和原理理解
一.代码的理解 <template><div id"app"><div></div><button click"fn" ref"box"> {{ name }}</button></div> </template><script> export default {data: function () {return {n…...
![](https://www.ngui.cc/images/no-images.jpg)
.Net Core 微服务之Consul
目录 一、微服务架构 vs 单体架构 1. 单体架构介绍 2. 微服务架构介绍 3. 微服务架构 vs 单体架构的区别 4. 适用场景和选择 4.1 微服务架构的适用场景和选择 复杂度和规模需求高的应用程序: 技术栈的灵活性需求: 快速迭代和持续交付: 高可用性和容错性的要求: 4…...
![](https://www.ngui.cc/images/no-images.jpg)
速盾:cdn流量调度
CDN(Content Delivery Network)是指内容分发网络,它是一种通过部署在不同地理位置的服务器来传递互联网内容的技术。CDN的主要目标是通过将内容放置在离用户最近的服务器上,来提高用户访问网站的响应速度和性能。 CDN的流量调度是…...
![](https://www.ngui.cc/images/no-images.jpg)
Windows批处理入门:快速掌握批处理脚本的基本技巧
一、前言 在Windows操作系统中,批处理文件(Batch File)是一种非常实用的工具,它允许用户通过简单的命令行脚本来自动化各种任务。无论是系统管理员、开发人员,还是普通用户,掌握批处理文件的基本知识都能极…...
![](https://www.ngui.cc/images/no-images.jpg)
【C++之unordered_set和unordered_map的模拟实现】
C学习笔记---025 C之unordered_set和unordered_map的模拟实现1、unordered_set的模拟实现2、unordered_map的模拟实现 C之unordered_set和unordered_map的模拟实现 前言: 前面篇章学习了C对unordered_set和unordered_map的认识和应用,接下来继续学习&am…...
![](https://www.ngui.cc/images/no-images.jpg)
服务器使用别人的conda
很多台机器都共用一个conda时候,可以在conda的bin目录下运行./conda init来使得该环境机器用这个conda作为默认的conda。 但是有个环境报错: -bash: ./conda: /apdcephfs_cq8/share_1367250/jaimeji/anaconda/jaime_conda/bin/python: bad interpreter:…...
![](https://img-blog.csdnimg.cn/img_convert/567f0ac8eae826bd2d082a74b46e3c86.png)
农村程序员陈随易2024年中总结
今天是 2024年7月1日,时间如白驹过隙,今年已去其一半。 总结一下今年上半年的情况,给大家提供一些参考和建议。 希望大家关注一下公众号 陈随易,有些内容只在公众号发表。 先看看我的年初计划,这个在今年年初的时候&…...
![](https://www.ngui.cc/images/no-images.jpg)
Spring Boot中的日志管理最佳实践
Spring Boot中的日志管理最佳实践 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!今天我们来探讨一下在Spring Boot应用中如何有效管理日志,确保系统…...
![](https://img-blog.csdnimg.cn/direct/df41f604b2354605a09b42d8d931040b.png)
python基础语法 004-2流程控制- for遍历
1 遍历 1.1 什么是遍历? 可以遍历的元素:字符串、列表、元组、字典、集合字符串是可以进行for 循环。(容器对象,序列)可迭代对象iterable 例子: 1 )、for遍历字符串: name xiao…...
![](https://www.ngui.cc/images/no-images.jpg)
【高考志愿】医学
目录 一、明确职业定位与兴趣 二、选择大学与专业 三、考虑身体条件 四、了解录取规则 五、考虑选科与成绩 六、注意志愿填报策略 七、关注就业前景 八、资深医生的建议 高考志愿填报学医时,考生需要综合考虑多个因素,确保自己能够做出明智的选择…...
![](https://www.ngui.cc/images/no-images.jpg)
音视频开发31 FFmpeg 编码- avcodec_find_encoder和avcodec_find_encoder_by_name
avcodec_find_encoder /** * Find a registered encoder with a matching codec ID. * * param id AVCodecID of the requested encoder * return An encoder if one was found, NULL otherwise. */ AVCodec *avcodec_find_encoder(enum AVCodecID id); 那么这个 AVCodec…...
![](https://img-blog.csdnimg.cn/img_convert/dfc472de1a50e9aa9954add15c7ac94c.jpeg)
分享大厂对于缓存操作的封装
hello,伙伴们好久不见,我是shigen。发现有两周没有更新我的文章了。也是因为最近比较忙,基本是993了。 缓存大家再熟悉不过了,几乎是现在任何系统的标配,并引申出来很多的问题:缓存穿透、缓存击穿、缓存雪崩…...
![](https://www.ngui.cc/images/no-images.jpg)
Postman编写测试脚本
在 Postman 中,编写测试脚本通常使用 JavaScript,这些脚本可以在请求发送前后执行。以下是一些示例代码,展示了如何在 Postman 中使用测试脚本。 1. 测试脚本示例:检查响应状态码 // 测试脚本在请求发送后执行 pm.test("Re…...
![](https://img-blog.csdnimg.cn/direct/6c086d3b5e4e42719c667f52f4be62c9.png)
Java实现登录验证 -- JWT令牌实现
目录 1.实现登录验证的引出原因 2.JWT令牌2.1 使用JWT令牌时2.2 令牌的组成 3. JWT令牌(token)生成和校验3.1 引入JWT令牌的依赖3.2 使用Jar包中提供的API来实现JWT令牌的生成和校验3.3 使用JWT令牌验证登录3.4 令牌的优缺点 1.实现登录验证的引出 传统…...
![](https://i-blog.csdnimg.cn/direct/5147f44eef724a51936cb9db109ed73f.png)
让ChatGPT干正事、说人话、会思考!借助ChatGPT润出优质论文的实操指南
大家好,感谢关注。我是七哥,一个在高校里不务正业,折腾学术科研AI实操的学术人。关于使用ChatGPT等AI学术科研的相关问题可以和作者七哥(yida985)交流,多多交流,相互成就,共同进步&a…...
![](https://img-blog.csdnimg.cn/img_convert/0251c16577b008dd174eb372a171728e.webp?x-oss-process=image/format,png)
Akamai+Noname强强联合 | API安全再加强
最近,Akamai正式完成了对Noname Security的收购。本文我们将向大家介绍,经过本次收购后,Akamai在保护API安全性方面的后续计划和未来愿景。 Noname Security是市场上领先的API安全供应商之一,此次收购将让Akamai能更好地满足日益增…...
![](https://img-blog.csdnimg.cn/direct/da60d5c07c0b400283ca1369dd6d5753.png)
自动驾驶水泥搅拌车在梁场的应用(下)
自动驾驶水泥搅拌车在梁场的应用(下) 北京渡众机器人科技有限公司的自动驾驶水泥搅拌车在梁场(也称为预制梁场)的应用可以带来多方面的优势和效益: 1. 自动化搅拌和运输 在梁场中,通常需要大量的混凝土搅…...
![](https://www.ngui.cc/images/no-images.jpg)
固态电池量产加速,我们离电动车新时代还有多远?
随着一则确定性很强的不确定性消息不胫而走,固态电池又一次成为目光焦点!5月29日,《中国日报》报道称,中国或投入约60亿元,鼓励有条件的企业对全固态电池相关技术开展研发,宁德时代、比亚迪、一汽、上汽、卫蓝新能源和吉利共六家企业或获得政府基础研发支持。多位知情人士…...
![](https://www.ngui.cc/images/no-images.jpg)
UE5文件操作
首先在虚幻引擎中创建UMyBlueprintFunctionLibrary类,可以在该类中写我们重复利用的功能,并且这些功能不依赖于特定的游戏对象,方便全局调用。 1.文件的读取和写入 UFUNCTION(BlueprintCallable, Category "File")static bool lo…...
![](https://img-blog.csdnimg.cn/direct/86ab0e561f6547fb84a534a5cd436ddb.png)
用户接入和认证技术
一、用户接入和认证配置 称为网络接入控制,通过对接入网络的客NAC (Network Admission Control)户端和用户的认证保证网络的安全,是一种“端到端”的安全技术。包括802.1x认证、MAC认证与Portal认证。 二、三种认证方式简介 1、Portal认证 Portal认证通…...
![](https://img-blog.csdnimg.cn/direct/2dbef4e198d340568596f111de6e4b1a.png)
【漏洞复现】大华智能物联综合管理平台 log4j远程代码执行漏洞
0x01 产品简介 大华ICC智能物联综合管理平台对技术组件进行模块化和松耦合,将解决方案分层分级,提高面向智慧物联的数据接入与生态合作能力。 0x02 漏洞概述 大华ICC智能物联综合管理平台/evo-apigw/evo-brm/1.2.0/user/is-exist 接口处存在 l0g4i远程…...
![](https://www.ngui.cc/images/no-images.jpg)
Flutter 中的 ExpansionPanelList 小部件:全面指南
Flutter 中的 ExpansionPanelList 小部件:全面指南 在Flutter中,ExpansionPanelList是一个展示可展开/折叠面板列表的组件,它允许用户通过点击来展开或折叠列表中的各个面板。这种组件非常适合展示FAQ、设置选项或其他需要分组和隐藏内容的场…...
![](https://img-blog.csdnimg.cn/img_convert/1abe189ef9c4dd30567c8f94d555b465.png)
索引问题引起的执行计划偏移(EBS Cost Management performance issue )
之前遇到的一个EBS性能问题,更新至CSDN Create Accounting - Cost Management_performance issue SYMPTOMS 元旦过后,create accounting cost management执行时间过长,还时常报错,影响正常作业; 1.对比2018/12和20…...