# 信号处理JNI封装使用说明 ## 概述 本项目已将C++信号处理功能封装成JNI接口,可以在Android应用中直接调用。主要功能包括: - 各种数字滤波器(带通、低通、高通、陷波) - 信号质量评估 - ECG信号质量指数计算 - 信号特征提取 - 信号预处理(归一化、去直流等) - 实时信号处理 ## 文件结构 ``` app/src/main/ ├── cpp/ │ ├── include/cpp/ │ │ └── signal_processor.h # C++头文件 │ ├── src/ │ │ └── signal_processor.cpp # C++实现文件(需要修复乱码) │ ├── jni/ │ │ └── jni_bridge.cpp # 统一的JNI桥接文件(包含所有JNI函数) │ └── CMakeLists.txt # 构建配置 └── java/ └── com/example/cmake_project_test/ ├── SignalProcessorJNI.kt # Java JNI接口类 └── SignalProcessorExample.kt # 使用示例类 ``` ## 使用方法 ### 1. 基本使用 ```kotlin // 创建信号处理器实例 val signalProcessor = SignalProcessorJNI() if (signalProcessor.createProcessor()) { // 使用各种信号处理功能 val filteredSignal = signalProcessor.bandpassFilter( inputSignal, sampleRate = 1000.0, lowFreq = 40.0, highFreq = 60.0 ) // 清理资源 signalProcessor.destroyProcessor() } ``` ### 2. 主要功能 #### 数字滤波 ```kotlin // 带通滤波 val bandpassResult = signalProcessor.bandpassFilter( signal, sampleRate, lowFreq, highFreq ) // 低通滤波 val lowpassResult = signalProcessor.lowpassFilter( signal, sampleRate, cutoffFreq ) // 高通滤波 val highpassResult = signalProcessor.highpassFilter( signal, sampleRate, cutoffFreq ) // 陷波滤波(去除工频干扰) val notchResult = signalProcessor.notchFilter( signal, sampleRate, notchFreq, qFactor ) ``` #### 信号质量评估 ```kotlin // 计算信号质量指数 val quality = signalProcessor.calculateSignalQuality(signal) // 计算ECG信号质量指数 val ecgSQI = signalProcessor.calculateECGSQI(ecgSignal, sampleRate) // 计算两个信号的相关性 val correlation = signalProcessor.calculateCorrelation(signal1, signal2) ``` #### 信号预处理 ```kotlin // 归一化信号幅度 signalProcessor.normalizeAmplitude(signal) // 提取信号特征 val features = signalProcessor.extractFeatures(signal, sampleRate) // 重置滤波器状态 signalProcessor.resetFilters() ``` #### 实时处理 ```kotlin // 实时处理数据块 val processedChunk = signalProcessor.processRealtimeChunk( chunk, sampleRate ) ``` ### 3. 完整示例 参考 `SignalProcessorExample.kt` 文件,其中包含了所有功能的演示代码: ```kotlin val example = SignalProcessorExample() // 运行所有演示 example.runAllDemonstrations() // 清理资源 example.cleanup() ``` ## 数据格式 ### 输入数据 - 所有信号数据使用 `FloatArray` 格式 - 采样率使用 `Double` 类型 - 频率参数使用 `Double` 类型 ### 输出数据 - 滤波结果返回 `FloatArray?`(可能为null表示处理失败) - 质量指数返回 `Float` 类型(0.0-1.0) - 相关性返回 `Float` 类型(-1.0到1.0) ### 内部转换 - Java端使用 `ByteBuffer` 进行 `FloatArray` 和 `ByteArray` 的转换 - C++端使用 `std::vector` 处理数据 - 字节序使用小端序(Little Endian) ## 注意事项 ### 1. 资源管理 ```kotlin // 必须在使用前创建处理器 if (!signalProcessor.createProcessor()) { // 处理创建失败的情况 return } // 使用完毕后必须销毁处理器 signalProcessor.destroyProcessor() ``` ### 2. 错误处理 ```kotlin val result = signalProcessor.bandpassFilter(signal, sampleRate, lowFreq, highFreq) if (result != null) { // 处理成功 processResult(result) } else { // 处理失败 Log.e("SignalProcessor", "滤波处理失败") } ``` ### 3. 性能考虑 - 滤波器初始化有一定开销,建议复用处理器实例 - 大数据量处理时考虑分块处理 - 实时处理时注意内存分配 ### 4. 线程安全 - JNI函数不是线程安全的 - 多线程使用时需要适当的同步机制 - 建议在主线程或专用工作线程中使用 ## 构建配置 ### CMakeLists.txt 确保在 `CMakeLists.txt` 中包含了信号处理库: ```cmake # Signal processor static library add_library(signal_processor STATIC src/signal_processor.cpp) target_include_directories(signal_processor PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include) # 链接到主库 target_link_libraries(${CMAKE_PROJECT_NAME} core_math data_parser signal_processor android log) ``` **注意**:信号处理的JNI函数现在已整合到 `jni_bridge.cpp` 中,不再需要单独的 `signal_processor_jni.cpp` 文件。 ### 库加载 在Java代码中确保正确加载原生库: ```kotlin companion object { init { System.loadLibrary("cmake_project_test") } } ``` ## 故障排除 ### 1. 编译错误 - 检查 `CMakeLists.txt` 配置 - 确保所有源文件路径正确 - 检查头文件包含路径 ### 2. 运行时错误 - 检查Logcat中的错误信息 - 确保处理器已正确创建 - 检查输入数据格式和大小 ### 3. 性能问题 - 使用Android Profiler分析性能瓶颈 - 考虑减少数据转换开销 - 优化滤波器参数 ## 扩展功能 ### 1. 添加新的滤波器 1. 在 `signal_processor.h` 中声明新方法 2. 在 `signal_processor.cpp` 中实现 3. 在 `signal_processor_jni.cpp` 中添加JNI封装 4. 在 `SignalProcessorJNI.kt` 中添加Java接口 ### 2. 自定义信号处理 可以基于现有的JNI接口构建更高级的信号处理功能: ```kotlin class AdvancedSignalProcessor(private val jni: SignalProcessorJNI) { fun adaptiveFilter(signal: FloatArray, sampleRate: Double): FloatArray? { // 实现自适应滤波算法 // 使用JNI接口调用底层功能 } } ``` ## 总结 通过JNI封装,您现在可以在Android应用中直接使用C++的高性能信号处理功能。这种架构既保持了C++的性能优势,又提供了Java/Kotlin的易用性。 建议在使用前先运行示例代码,熟悉各种功能的使用方法,然后根据具体需求进行定制化开发。