本文档提供了YiShape-Math信号处理模块的完整使用示例,从基础到高级,帮助用户快速掌握各种信号处理功能的使用方法。
This document provides complete usage examples of the YiShape-Math signal processing module, from basic to advanced, helping users quickly master the use of various signal processing functions.
- 基础信号处理示例 / Basic Signal Processing Examples
- 高级信号处理示例 / Advanced Signal Processing Examples
- 实时信号处理示例 / Real-time Signal Processing Examples
- 滤波器功能示例 / Filter Functionality Examples
第一部分:基础信号处理示例 (Level 1 - Basic Signal Processing Examples) / Part 1: Basic Signal Processing Examples (Level 1 - Basic Signal Processing Examples)
``java import com.yishape.lab.math.signal.Signals; import com.yishape.lab.math.linalg.IVector; import com.yishape.lab.math.linalg.Linalg; import com.yishape.lab.util.Tuple2;
public class BasicSignalGenerationExample { public static void main(String[] args) { System.out.println("=== 基本信号生成 / Basic Signal Generation ===");
// 生成各种基本波形 / Generate various basic waveforms
IVector<Double> sineWave = Signals.sineWave(1000, 50.0, 1000.0, 1.0, 0.0);
IVector<Double> cosineWave = Signals.cosineWave(1000, 50.0, 1000.0, 1.0, 0.0);
IVector<Double> squareWave = Signals.squareWave(1000, 50.0, 1000.0, 1.0, 0.5);
IVector<Double> triangularWave = Signals.triangularWave(1000, 50.0, 1000.0, 1.0, 0.5);
IVector<Double> sawtoothWave = Signals.sawtoothWave(1000, 50.0, 1000.0, 1.0);
// 生成噪声信号 / Generate noise signals
IVector<Double> whiteNoise = Signals.whiteNoise(1000, 0.1);
IVector<Double> pinkNoise = Signals.pinkNoise(1000, 0.1);
// 输出信号统计信息 / Output signal statistics
printSignalStatistics(sineWave, "正弦波 / Sine Wave");
printSignalStatistics(cosineWave, "余弦波 / Cosine Wave");
printSignalStatistics(whiteNoise, "白噪声 / White Noise");
System.out.println("基本信号生成完成 / Basic signal generation completed");
}
private static void printSignalStatistics(IVector<Double> signal, String signalName) {
System.out.println(signalName + " 统计信息 / " + signalName + " Statistics:");
System.out.println(" 长度: " + signal.length());
System.out.println(" 均值: " + String.format("%.3f", signal.mean()));
System.out.println(" 标准差: " + String.format("%.3f", signal.std()));
System.out.println(" 最大值: " + String.format("%.3f", signal.max()));
System.out.println(" 最小值: " + String.format("%.3f", signal.min()));
System.out.println(" 方差: " + String.format("%.3f", signal.var()));
}
}
### 1.2 复合信号生成 / Composite Signal Generation
``java
public class CompositeSignalGenerationExample {
public static void main(String[] args) {
System.out.println("=== 复合信号生成 / Composite Signal Generation ===");
// 使用新添加的复合信号生成方法 / Using newly added composite signal generation methods
// 生成阶跃信号 / Generate step signal
IVector<Double> stepSignal = Signals.stepSignal(1000, 1.0, 0.5, 1000.0);
System.out.println("阶跃信号生成完成,长度: " + stepSignal.length());
// 生成单位阶跃信号 / Generate unit step signal
IVector<Double> unitStep = Signals.unitStep(1000, 0.5, 1000.0);
System.out.println("单位阶跃信号生成完成,长度: " + unitStep.length());
// 生成脉冲信号 / Generate pulse signal
IVector<Double> pulseSignal = Signals.pulseSignal(1000, 1.0, 10, 10.0, 1000.0);
System.out.println("脉冲信号生成完成,长度: " + pulseSignal.length());
// 生成单位脉冲信号 / Generate unit impulse signal
IVector<Double> unitImpulse = Signals.unitImpulse(1000, 500);
System.out.println("单位脉冲信号生成完成,长度: " + unitImpulse.length());
// 生成线性调频信号 / Generate linear chirp signal
IVector<Double> chirpSignal = Signals.chirpSignal(1000, 10.0, 100.0, 1000.0, 1.0);
System.out.println("线性调频信号生成完成,长度: " + chirpSignal.length());
// 生成狄拉克δ函数 / Generate Dirac delta function
IVector<Double> diracDelta = Signals.diracDelta(1000, 100, 1.0);
System.out.println("狄拉克δ函数生成完成,长度: " + diracDelta.length());
// 使用复合信号生成方法 / Using composite signal generation method
com.yishape.lab.math.signal.generation.ISignalGenerator.SignalType[] signalTypes = {
com.yishape.lab.math.signal.generation.ISignalGenerator.SignalType.SINE,
com.yishape.lab.math.signal.generation.ISignalGenerator.SignalType.COSINE
};
com.yishape.lab.math.signal.generation.ISignalGenerator.SignalParameters[] parameters = {
new com.yishape.lab.math.signal.generation.ISignalGenerator.SignalParameters().frequency(10.0).amplitude(1.0).samplingRate(1000.0),
new com.yishape.lab.math.signal.generation.ISignalGenerator.SignalParameters().frequency(20.0).amplitude(0.5).samplingRate(1000.0)
};
IVector<Double> compositeSignal = Signals.compositeSignal(signalTypes, 1000, parameters);
System.out.println("复合信号生成完成,长度: " + compositeSignal.length());
// 添加噪声 / Add noise
IVector<Double> noisySignal = Signals.addNoise(
compositeSignal,
com.yishape.lab.math.signal.generation.ISignalGenerator.SignalType.WHITE_NOISE,
new com.yishape.lab.math.signal.generation.ISignalGenerator.SignalParameters().noiseVariance(0.1).samplingRate(1000.0)
);
System.out.println("带噪声信号生成完成,长度: " + noisySignal.length());
System.out.println("所有复合信号生成完成 / All composite signals generation completed");
}
}
``java public class BasicFilteringExample { public static void main(String[] args) { System.out.println("=== 基础滤波示例 / Basic Filtering Examples ===");
// 生成测试信号 / Generate test signal
IVector<Double> cleanSignal = Signals.sineWave(1000, 50.0, 1000.0, 1.0, 0.0);
IVector<Double> noise = Signals.whiteNoise(1000, 0.3);
IVector<Double> noisySignal = cleanSignal.add(noise);
System.out.println("测试信号生成完成 / Test signal generation completed");
// 应用各种基础滤波器 / Apply various basic filters
IVector<Double> movingAvgFiltered = Signals.movingAverage(noisySignal, 5);
System.out.println("移动平均滤波完成 / Moving average filtering completed");
IVector<Double> medianFiltered = Signals.medianFilter(noisySignal, 5);
System.out.println("中值滤波完成 / Median filtering completed");
IVector<Double> gaussianFiltered = Signals.gaussianFilter(noisySignal, 1.0);
System.out.println("高斯滤波完成 / Gaussian filtering completed");
// 应用频域滤波器 / Apply frequency domain filters
IVector<Double> lowPassFiltered = Signals.butterworthLowPass(noisySignal, 100.0, 1000.0, 2);
System.out.println("巴特沃斯低通滤波完成 / Butterworth low-pass filtering completed");
IVector<Double> highPassFiltered = Signals.butterworthHighPass(noisySignal, 10.0, 1000.0, 2);
System.out.println("巴特沃斯高通滤波完成 / Butterworth high-pass filtering completed");
IVector<Double> bandPassFiltered = Signals.bandPass(noisySignal, 20.0, 80.0, 1000.0, 2);
System.out.println("带通滤波完成 / Band-pass filtering completed");
// 计算信噪比改善 / Calculate SNR improvement
double originalSNR = Signals.signalToNoiseRatio(cleanSignal, noise);
double filteredSNR = Signals.signalToNoiseRatio(cleanSignal, cleanSignal.sub(movingAvgFiltered));
System.out.println("原始信噪比: " + String.format("%.2f", originalSNR) + " dB");
System.out.println("滤波后信噪比: " + String.format("%.2f", filteredSNR) + " dB");
System.out.println("信噪比改善: " + String.format("%.2f", filteredSNR - originalSNR) + " dB");
}
}
## 第二部分:高级信号处理示例 (Level 2 - Advanced Signal Processing Examples) / Part 2: Advanced Signal Processing Examples (Level 2 - Advanced Signal Processing Examples)
### 2.1 完整信号处理流程 / Complete Signal Processing Workflow
```java
import com.yishape.lab.math.signal.Signals;
import com.yishape.lab.math.signal.SignalUtilities;
import com.yishape.lab.math.linalg.IVector;
import com.yishape.lab.math.linalg.Linalg;
import com.yishape.lab.util.Tuple2;
public class CompleteSignalProcessingExample {
public static void main(String[] args) {
System.out.println("=== 完整信号处理流程 / Complete Signal Processing Workflow ===");
// 1. 生成测试信号 / Generate test signal
IVector<Double> signal1 = Signals.sineWave(1000, 10.0, 1000.0, 1.0, 0.0);
IVector<Double> signal2 = Signals.sineWave(1000, 50.0, 1000.0, 0.5, 0.0);
IVector<Double> signal3 = Signals.sineWave(1000, 100.0, 1000.0, 0.3, 0.0);
IVector<Double> signal = signal1.add(signal2).add(signal3);
// 添加噪声 / Add noise
IVector<Double> noise = Signals.whiteNoise(1000, 0.1);
IVector<Double> noisySignal = signal.add(noise);
System.out.println("=== 完整信号处理流程 / Complete Signal Processing Workflow ===");
// 2. 信号预处理 / Signal preprocessing
System.out.println("\n--- 步骤1: 信号预处理 / Step 1: Signal Preprocessing ---");
IVector<Double> normalized = SignalUtilities.normalize(noisySignal, -1.0, 1.0);
IVector<Double> detrended = SignalUtilities.detrend(normalized);
System.out.println("预处理完成,信号长度: " + detrended.length());
// 3. 信号滤波 / Signal filtering
System.out.println("\n--- 步骤2: 信号滤波 / Step 2: Signal Filtering ---");
IVector<Double> filtered = Signals.butterworthLowPass(detrended, 80.0, 1000.0, 2);
System.out.println("滤波完成");
// 4. 频谱分析 / Spectral analysis
System.out.println("\n--- 步骤3: 频谱分析 / Step 3: Spectral Analysis ---");
Tuple2<IVector<Double>, IVector<Double>> psdResult = Signals.powerSpectralDensity(
filtered, 256, 0.5, 1000.0
);
System.out.println("功率谱密度计算完成");
// 5. 小波分析 / Wavelet analysis
System.out.println("\n--- 步骤4: 小波分析 / Step 4: Wavelet Analysis ---");
com.yishape.lab.math.signal.WaveletAnalysis.WaveletCoefficients coeffs = com.yishape.lab.math.signal.WaveletAnalysis.discreteWaveletTransform(
filtered, com.yishape.lab.math.signal.WaveletAnalysis.WaveletType.DAUBECHIES, 4, 4.0
);
System.out.println("小波分解完成,层数: " + coeffs.levels);
// 6. 特征提取 / Feature extraction
System.out.println("\n--- 步骤5: 特征提取 / Step 5: Feature Extraction ---");
IVector<Double> features = com.yishape.lab.math.signal.WaveletAnalysis.waveletFeatureExtraction(coeffs);
System.out.println("特征提取完成,特征数量: " + features.length());
// 7. 信号重建 / Signal reconstruction
System.out.println("\n--- 步骤6: 信号重建 / Step 6: Signal Reconstruction ---");
IVector<Double> reconstructed = com.yishape.lab.math.signal.WaveletAnalysis.inverseDiscreteWaveletTransform(
coeffs, com.yishape.lab.math.signal.WaveletAnalysis.WaveletType.DAUBECHIES, 4.0
);
System.out.println("信号重建完成");
// 8. 性能评估 / Performance evaluation
System.out.println("\n--- 步骤7: 性能评估 / Step 7: Performance Evaluation ---");
double snr = Signals.signalToNoiseRatio(signal, signal.sub(reconstructed));
double psnr = Signals.peakSignalToNoiseRatio(signal, reconstructed);
System.out.println("信噪比: " + snr + " dB");
System.out.println("峰值信噪比: " + psnr + " dB");
}
}
``java public class AdvancedWaveletAnalysisExample { public static void main(String[] args) { System.out.println("=== 高级小波分析 / Advanced Wavelet Analysis ===");
// 生成复杂测试信号 / Generate complex test signal
IVector<Double> signal = generateComplexTestSignal();
// 添加噪声 / Add noise
IVector<Double> noise = Signals.whiteNoise(signal.length(), 0.15);
IVector<Double> noisySignal = signal.add(noise);
System.out.println("测试信号生成完成,长度: " + signal.length());
// 比较不同小波类型 / Compare different wavelet types
com.yishape.lab.math.signal.WaveletAnalysis.WaveletType[] waveletTypes = {
com.yishape.lab.math.signal.WaveletAnalysis.WaveletType.HAAR,
com.yishape.lab.math.signal.WaveletAnalysis.WaveletType.DAUBECHIES,
com.yishape.lab.math.signal.WaveletAnalysis.WaveletType.MORLET
};
for (com.yishape.lab.math.signal.WaveletAnalysis.WaveletType waveletType : waveletTypes) {
System.out.println("\n--- 使用 " + waveletType + " 小波 / Using " + waveletType + " Wavelet ---");
// 小波分解 / Wavelet decomposition
com.yishape.lab.math.signal.WaveletAnalysis.WaveletCoefficients coeffs = com.yishape.lab.math.signal.Signals.discreteWaveletTransform(
noisySignal, waveletType, 5, getWaveletParameter(waveletType)
);
// 小波去噪 / Wavelet denoising
IVector<Double> denoised = com.yishape.lab.math.signal.WaveletAnalysis.waveletDenoising(
noisySignal, waveletType, 5, 0.1, getWaveletParameter(waveletType)
);
// 小波压缩 / Wavelet compression
IVector<Double> compressed = com.yishape.lab.math.signal.WaveletAnalysis.waveletCompression(
noisySignal, waveletType, 5, 0.3, getWaveletParameter(waveletType)
);
// 小波包变换 / Wavelet packet transform
com.yishape.lab.math.signal.WaveletAnalysis.WaveletPacketTree packetTree = com.yishape.lab.math.signal.WaveletAnalysis.waveletPacketTransform(
noisySignal, waveletType, 4, getWaveletParameter(waveletType)
);
// 分析结果 / Analyze results
analyzeWaveletResults(signal, noisySignal, denoised, compressed, coeffs, waveletType);
}
// 连续小波变换分析 / Continuous wavelet transform analysis
System.out.println("\n--- 连续小波变换分析 / Continuous Wavelet Transform Analysis ---");
performContinuousWaveletAnalysis(noisySignal);
}
private static IVector<Double> generateComplexTestSignal() {
// 生成包含瞬态和调频的复杂信号
// Generate complex signal with transients and frequency modulation
IVector<Double> baseSignal1 = Signals.sineWave(2048, 20.0, 2048.0, 1.0, 0.0);
IVector<Double> baseSignal2 = Signals.sineWave(2048, 60.0, 2048.0, 0.8, 0.0);
IVector<Double> baseSignal3 = Signals.sineWave(2048, 120.0, 2048.0, 0.6, 0.0);
IVector<Double> baseSignal = baseSignal1.add(baseSignal2).add(baseSignal3);
// 添加调频信号 / Add frequency modulated signal
IVector<Double> fmSignal = Signals.chirpSignal(2048, 10.0, 50.0, 2048.0, 0.5);
// 添加瞬态信号 / Add transient signals
IVector<Double> transient1 = Signals.diracDelta(2048, 512, 2.0);
IVector<Double> transient2 = Signals.diracDelta(2048, 1024, 1.5);
IVector<Double> transient3 = Signals.diracDelta(2048, 1536, 1.8);
return baseSignal.add(fmSignal).add(transient1).add(transient2).add(transient3);
}
private static double getWaveletParameter(com.yishape.lab.math.signal.WaveletAnalysis.WaveletType waveletType) {
switch (waveletType) {
case DAUBECHIES:
return 4.0; // db4
case MORLET:
return 5.0; // 中心频率 / Center frequency
case GAUSSIAN:
return 2.0; // 高斯阶数 / Gaussian order
default:
return 0.0;
}
}
private static void analyzeWaveletResults(IVector<Double> original, IVector<Double> noisy,
IVector<Double> denoised, IVector<Double> compressed,
com.yishape.lab.math.signal.WaveletAnalysis.WaveletCoefficients coeffs,
com.yishape.lab.math.signal.WaveletAnalysis.WaveletType waveletType) {
// 计算信噪比 / Calculate signal-to-noise ratio
double originalSNR = Signals.signalToNoiseRatio(original, original.sub(noisy));
double denoisedSNR = Signals.signalToNoiseRatio(original, original.sub(denoised));
double compressedSNR = Signals.signalToNoiseRatio(original, original.sub(compressed));
// 计算峰值信噪比 / Calculate peak signal-to-noise ratio
double originalPSNR = Signals.peakSignalToNoiseRatio(original, noisy);
double denoisedPSNR = Signals.peakSignalToNoiseRatio(original, denoised);
double compressedPSNR = Signals.peakSignalToNoiseRatio(original, compressed);
// 小波能量分析 / Wavelet energy analysis
IVector<Double> energy = com.yishape.lab.math.signal.WaveletAnalysis.waveletEnergyAnalysis(coeffs);
// 小波特征提取 / Wavelet feature extraction
IVector<Double> features = com.yishape.lab.math.signal.WaveletAnalysis.waveletFeatureExtraction(coeffs);
System.out.println("小波类型: " + waveletType);
System.out.println("原始信噪比: " + String.format("%.2f", originalSNR) + " dB");
System.out.println("去噪后信噪比: " + String.format("%.2f", denoisedSNR) + " dB");
System.out.println("压缩后信噪比: " + String.format("%.2f", compressedSNR) + " dB");
System.out.println("原始峰值信噪比: " + String.format("%.2f", originalPSNR) + " dB");
System.out.println("去噪后峰值信噪比: " + String.format("%.2f", denoisedPSNR) + " dB");
System.out.println("压缩后峰值信噪比: " + String.format("%.2f", compressedPSNR) + " dB");
System.out.println("小波能量分布: " + energy);
System.out.println("小波特征数量: " + features.length());
}
private static void performContinuousWaveletAnalysis(IVector<Double> signal) {
// 生成尺度数组 / Generate scale array
IVector<Double> scales = Linalg.linspace(1.0, 100.0, 50);
// 执行连续小波变换 / Perform continuous wavelet transform
com.yishape.lab.math.linalg.IMatrix<Double> cwt = com.yishape.lab.math.signal.WaveletAnalysis.continuousWaveletTransform(
signal, com.yishape.lab.math.signal.WaveletAnalysis.WaveletType.MORLET, scales, 5.0
);
System.out.println("连续小波变换完成");
System.out.println("CWT矩阵大小: " + cwt.getRowNum() + " x " + cwt.getColNum());
System.out.println("尺度范围: " + scales.get(0) + " - " + scales.get(scales.length()-1));
// 分析CWT结果 / Analyze CWT results
double maxCWT = cwt.max();
double minCWT = cwt.min();
System.out.println("CWT最大值: " + String.format("%.3f", maxCWT));
System.out.println("CWT最小值: " + String.format("%.3f", minCWT));
}
}
## 第三部分:实时信号处理示例 (Level 3 - Real-time Signal Processing Examples) / Part 3: Real-time Signal Processing Examples (Level 3 - Real-time Signal Processing Examples)
### 3.1 实时信号处理 / Real-time Signal Processing
```java
import com.yishape.lab.math.signal.Signals;
import com.yishape.lab.math.linalg.IVector;
import com.yishape.lab.math.linalg.Linalg;
import com.yishape.lab.util.Tuple2;
public class RealTimeSignalProcessingExample {
public static void main(String[] args) {
System.out.println("=== 实时信号处理 / Real-time Signal Processing ===");
// 模拟实时信号处理 / Simulate real-time signal processing
int bufferSize = 512;
int numBuffers = 20;
double samplingRate = 1000.0;
// 初始化滤波器状态 / Initialize filter state
IVector<Double> previousBuffer = Linalg.zeros(bufferSize);
for (int buffer = 0; buffer < numBuffers; buffer++) {
System.out.println("\n--- 处理缓冲区 " + (buffer + 1) + " / Processing Buffer " + (buffer + 1) + " ---");
// 生成当前缓冲区的信号 / Generate signal for current buffer
IVector<Double> currentSignal = generateRealTimeSignal(buffer, bufferSize, samplingRate);
// 添加噪声 / Add noise
IVector<Double> noise = Signals.whiteNoise(bufferSize, 0.05);
IVector<Double> noisySignal = currentSignal.add(noise);
// 实时滤波 / Real-time filtering
IVector<Double> filtered = performRealTimeFiltering(noisySignal, previousBuffer);
// 实时频谱分析 / Real-time spectral analysis
RealTimeSpectralResult spectralResult = performRealTimeSpectralAnalysis(filtered, samplingRate);
// 实时特征提取 / Real-time feature extraction
IVector<Double> features = performRealTimeFeatureExtraction(filtered, spectralResult);
// 实时检测 / Real-time detection
RealTimeDetectionResult detectionResult = performRealTimeDetection(filtered);
// 输出结果 / Output results
System.out.println("信号长度: " + filtered.length());
System.out.println("主要频率: " + String.format("%.1f", spectralResult.dominantFreq) + " Hz");
System.out.println("信号功率: " + String.format("%.3f", spectralResult.power));
System.out.println("检测到峰值: " + detectionResult.peakCount + " 个");
System.out.println("特征数量: " + features.length());
// 更新状态 / Update state
previousBuffer = filtered.copy();
}
}
private static IVector<Double> generateRealTimeSignal(int bufferIndex, int bufferSize, double samplingRate) {
// 生成随时间变化的信号 / Generate time-varying signal
double baseFreq = 50.0 + bufferIndex * 2.0; // 频率递增 / Increasing frequency
double amplitude = 1.0 + 0.1 * Math.sin(bufferIndex * 0.1); // 幅度调制 / Amplitude modulation
return Signals.sineWave(
bufferSize,
baseFreq,
samplingRate,
amplitude,
0.0
);
}
private static IVector<Double> performRealTimeFiltering(IVector<Double> signal, IVector<Double> previousBuffer) {
// 简单的移动平均滤波 / Simple moving average filtering
return Signals.movingAverage(signal, 5);
}
private static RealTimeSpectralResult performRealTimeSpectralAnalysis(IVector<Double> signal, double samplingRate) {
// 计算功率谱密度 / Calculate power spectral density
Tuple2<IVector<Double>, IVector<Double>> psdResult = Signals.powerSpectralDensity(
signal, 128, 0.5, samplingRate
);
IVector<Double> frequencies = psdResult._1;
IVector<Double> psd = psdResult._2;
// 找到主要频率 / Find dominant frequency
int maxIndex = 0;
double maxPower = psd.get(0);
for (int i = 1; i < psd.length(); i++) {
if (psd.get(i) > maxPower) {
maxPower = psd.get(i);
maxIndex = i;
}
}
double dominantFreq = frequencies.get(maxIndex);
double power = psd.sum();
return new RealTimeSpectralResult(dominantFreq, power, psd);
}
private static IVector<Double> performRealTimeFeatureExtraction(IVector<Double> signal,
RealTimeSpectralResult spectralResult) {
java.util.List<Double> features = new java.util.ArrayList<>();
// 时域特征 / Time domain features
features.add(signal.mean());
features.add(signal.std());
features.add(signal.max());
features.add(signal.min());
// 频域特征 / Frequency domain features
features.add(spectralResult.dominantFreq);
features.add(spectralResult.power);
// 转换为向量 / Convert to vector
double[] featureArray = new double[features.size()];
for (int i = 0; i < features.size(); i++) {
featureArray[i] = features.get(i);
}
return Linalg.vector(featureArray);
}
private static RealTimeDetectionResult performRealTimeDetection(IVector<Double> signal) {
// 峰值检测 / Peak detection
int[] peaks = SignalUtilities.detectPeaks(signal, 0.3, 20);
// 过零检测 / Zero crossing detection
int[] zeroCrossings = SignalUtilities.detectZeroCrossings(signal);
return new RealTimeDetectionResult(peaks.length, zeroCrossings.length);
}
// 结果类 / Result classes
private static class RealTimeSpectralResult {
double dominantFreq;
double power;
IVector<Double> psd;
RealTimeSpectralResult(double dominantFreq, double power, IVector<Double> psd) {
this.dominantFreq = dominantFreq;
this.power = power;
this.psd = psd;
}
}
private static class RealTimeDetectionResult {
int peakCount;
int zeroCrossingCount;
RealTimeDetectionResult(int peakCount, int zeroCrossingCount) {
this.peakCount = peakCount;
this.zeroCrossingCount = zeroCrossingCount;
}
}
}
第四部分:滤波器功能示例 (Level 4 - Filter Functionality Examples) / Part 4: Filter Functionality Examples (Level 4 - Filter Functionality Examples)
``java public class KalmanFilteringExample { public static void main(String[] args) { System.out.println("=== 卡尔曼滤波 / Kalman Filtering ===");
// 生成带噪声的测试信号 / Generate noisy test signal
IVector<Double> cleanSignal = Signals.sineWave(1000, 10.0, 1000.0, 1.0, 0.0);
IVector<Double> noise = Signals.whiteNoise(1000, 0.1);
IVector<Double> noisySignal = cleanSignal.add(noise);
// 应用卡尔曼滤波 / Apply Kalman filtering
IVector<Double> kalmanFiltered = Signals.kalmanFilter(noisySignal, 0.1, 0.1);
// 计算性能指标 / Calculate performance metrics
double originalSNR = Signals.signalToNoiseRatio(cleanSignal, noise);
double filteredSNR = Signals.signalToNoiseRatio(cleanSignal, cleanSignal.sub(kalmanFiltered));
System.out.println("原始信噪比: " + String.format("%.2f", originalSNR) + " dB");
System.out.println("卡尔曼滤波后信噪比: " + String.format("%.2f", filteredSNR) + " dB");
System.out.println("信噪比改善: " + String.format("%.2f", filteredSNR - originalSNR) + " dB");
// 通过工厂模式使用卡尔曼滤波器 / Using Kalman filter through factory pattern
try {
com.yishape.lab.math.signal.filter.ISignalFilter<Double> kalmanFilter = Signals.createFilter("kalman");
IVector<Double> factoryFiltered = kalmanFilter.process(noisySignal);
System.out.println("工厂模式卡尔曼滤波完成");
} catch (Exception e) {
System.err.println("工厂模式卡尔曼滤波失败: " + e.getMessage());
}
}
}
### 4.2 维纳滤波 / Wiener Filtering
``java
public class WienerFilteringExample {
public static void main(String[] args) {
System.out.println("=== 维纳滤波 / Wiener Filtering ===");
// 生成带噪声的测试信号 / Generate noisy test signal
IVector<Double> cleanSignal = Signals.sineWave(1000, 10.0, 1000.0, 1.0, 0.0);
IVector<Double> noise = Signals.whiteNoise(1000, 0.1);
IVector<Double> noisySignal = cleanSignal.add(noise);
// 应用维纳滤波 / Apply Wiener filtering
IVector<Double> wienerFiltered = Signals.wienerFilter(noisySignal, 1.0, 0.1, 10);
// 计算性能指标 / Calculate performance metrics
double originalSNR = Signals.signalToNoiseRatio(cleanSignal, noise);
double filteredSNR = Signals.signalToNoiseRatio(cleanSignal, cleanSignal.sub(wienerFiltered));
System.out.println("原始信噪比: " + String.format("%.2f", originalSNR) + " dB");
System.out.println("维纳滤波后信噪比: " + String.format("%.2f", filteredSNR) + " dB");
System.out.println("信噪比改善: " + String.format("%.2f", filteredSNR - originalSNR) + " dB");
// 通过工厂模式使用维纳滤波器 / Using Wiener filter through factory pattern
try {
com.yishape.lab.math.signal.filter.ISignalFilter<Double> wienerFilter = Signals.createFilter("wiener");
IVector<Double> factoryFiltered = wienerFilter.process(noisySignal);
System.out.println("工厂模式维纳滤波完成");
} catch (Exception e) {
System.err.println("工厂模式维纳滤波失败: " + e.getMessage());
}
}
}
``java public class BandStopFilteringExample { public static void main(String[] args) { System.out.println("=== 带阻滤波 / Band-stop Filtering ===");
// 生成包含干扰频率的测试信号 / Generate test signal with interference frequencies
IVector<Double> signal1 = Signals.sineWave(2000, 10.0, 2000.0, 1.0, 0.0);
IVector<Double> signal2 = Signals.sineWave(2000, 50.0, 2000.0, 0.8, 0.0); // 干扰频率 / Interference frequency
IVector<Double> signal3 = Signals.sineWave(2000, 100.0, 2000.0, 0.6, 0.0);
IVector<Double> signal4 = Signals.sineWave(2000, 150.0, 2000.0, 0.4, 0.0); // 干扰频率 / Interference frequency
IVector<Double> cleanSignal = signal1.add(signal2).add(signal3).add(signal4);
// 添加噪声 / Add noise
IVector<Double> noise = Signals.whiteNoise(2000, 0.05);
IVector<Double> noisySignal = cleanSignal.add(noise);
// 应用带阻滤波去除干扰频率 / Apply band-stop filtering to remove interference frequencies
IVector<Double> bandStopFiltered1 = Signals.bandStop(noisySignal, 45.0, 55.0, 2000.0, 2); // 去除50Hz干扰 / Remove 50Hz interference
IVector<Double> bandStopFiltered2 = Signals.bandStop(bandStopFiltered1, 145.0, 155.0, 2000.0, 2); // 去除150Hz干扰 / Remove 150Hz interference
// 计算性能指标 / Calculate performance metrics
double originalSNR = Signals.signalToNoiseRatio(cleanSignal, noise);
double filteredSNR = Signals.signalToNoiseRatio(cleanSignal, cleanSignal.sub(bandStopFiltered2));
System.out.println("原始信噪比: " + String.format("%.2f", originalSNR) + " dB");
System.out.println("带阻滤波后信噪比: " + String.format("%.2f", filteredSNR) + " dB");
System.out.println("信噪比改善: " + String.format("%.2f", filteredSNR - originalSNR) + " dB");
// 通过工厂模式使用带阻滤波器 / Using band-stop filter through factory pattern
try {
com.yishape.lab.math.signal.filter.ISignalFilter<Double> bandStopFilter = Signals.createFilter("bandstop");
IVector<Double> factoryFiltered = bandStopFilter.process(noisySignal);
System.out.println("工厂模式带阻滤波完成");
} catch (Exception e) {
System.err.println("工厂模式带阻滤波失败: " + e.getMessage());
}
}
}
## 辅助方法 / Helper Methods
``java
// 生成时间轴的辅助方法 / Helper method for generating time axis
private static IVector<Double> generateTimeAxis(int length, double samplingRate) {
return Linalg.range(length).multiplyScalar(1.0 / samplingRate);
}
// 计算信号统计信息的辅助方法 / Helper method for calculating signal statistics
private static void printSignalStatistics(IVector<Double> signal, String signalName) {
System.out.println(signalName + " 统计信息 / " + signalName + " Statistics:");
System.out.println(" 长度: " + signal.length());
System.out.println(" 均值: " + String.format("%.3f", signal.mean()));
System.out.println(" 标准差: " + String.format("%.3f", signal.std()));
System.out.println(" 最大值: " + String.format("%.3f", signal.max()));
System.out.println(" 最小值: " + String.format("%.3f", signal.min()));
System.out.println(" 方差: " + String.format("%.3f", signal.var()));
}
// 带通滤波辅助方法 / Helper method for bandpass filtering
private static IVector<Double> applyBandpassFilter(IVector<Double> signal, double lowFreq, double highFreq,
double samplingRate, int order) {
return Signals.bandPass(signal, lowFreq, highFreq, samplingRate, order);
}
信号处理示例 - 从基础到高级的完整学习路径!
Signal Processing Examples - Complete learning path from basic to advanced!