SDK_APP/SIGNAL_PROCESSOR_README.md

272 lines
6.3 KiB
Markdown
Raw Normal View History

2025-09-02 15:51:47 +08:00
# 信号处理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<float>` 处理数据
- 字节序使用小端序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的易用性。
建议在使用前先运行示例代码,熟悉各种功能的使用方法,然后根据具体需求进行定制化开发。