代码应该加载到一个 CSV 数据文件中,该文件有 50 行和 3000 列,每行都是一个脑电图睡眠信号。应单独读取每个信号,并且事件检测功能应区分清醒睡眠状态和非快速眼动睡眠状态。数据看起来像“U”形,其中清醒状态具有更高的值。阈值是 0.00046,任何高于该阈值的值都是唤醒信号。我们也只观察 500ms 到 2500ms 之间的信号。如果触发阈值,则信号应保存为 1,如果没有触发,则保存为 2。最终结果矩阵应为 50 x 1。
//Event detection
void event_detection(double signal[], int result_matrix[], int length, double threshold, int start_index, int end_index) {
for (int i = start_index; i <= end_index; i++) {
printf("%lf\n", signal[i]); // Print for debugging
// Assuming fft_result contains magnitudes of relevant frequencies
if (signal[i] > threshold) {
result_matrix[i] = 1; // Awake
}
else {
result_matrix[i] = 2; // Non-REM sleep
}
}
}
此事件检测功能无法按我需要的方式工作。当我调试它时,for 循环没有返回正确的数据,这导致其他一切都失败。我不知道如何解决它。
我认为问题在于循环实际上只根据检查的最后一个条目记录状态,并且您同时将
i
用于两个不同的目的。
您可能需要类似的测试:
int high = 0;
for (int i = start_index; i <= end_index; i++) {
printf("%lf\n", signal[i]); // Print for debugging
// Assuming fft_result contains magnitudes of relevant frequencies
if (signal[i] > threshold) {
high = 1;
break;
}
}
result_matrix[n] = high ? 1 : 2;
由于行可能有 3,000 列,而结果矩阵每行只有 1 个条目,因此您还需要将
i
与结果矩阵中的索引分开 - 我在代码片段中使用了 n
。
因为您没有提供 MCVE(最小、完整、可验证的示例 - 或 MRE 或 SO 现在使用的任何名称)或 SSCCE(简短、独立、正确的示例 - 相同的想法,但名称不同) ),很难确定发生了什么。任何具有 3,000 列的东西都太大而不能最小化。但是您可以提供包含 10 列、可能 5 行的简化数据,以及该简化样本数据的预期结果。您将更容易了解正在发生的情况 - 全尺寸数据样本对于手动检查来说会令人生畏。