NoiseDetectThread.h 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. #ifndef NOISEDETECTTHREAD_H_
  2. #define NOISEDETECTTHREAD_H_
  3. #include "BaseCalculateThread.h"
  4. #include "AudioData.h"
  5. #include "GlobalVariable.h"
  6. #include "SystemConfig.h"
  7. #include "RingQueueManualMutex.hpp"
  8. /* 模拟噪音报警 */
  9. #define CREATE_NOISE_WARN false
  10. class CreateWAVThread;
  11. class CreateRecordFileThread ;
  12. /**
  13. 噪音检测线程类
  14. 1、噪音检测线程是调用动态库检测噪音
  15. 2、噪音检测线程参数和对比项无关,是公共的参数,这里没有对比项信息
  16. 3、因为报警信息需要有对比项信息,所以这里有个map,保存对比项传入的信息,根据对比项信息
  17. 开启报警录制,如果这个通道被多个对比项使用,可能会同时录制多个报警文件。
  18. 上面说明作废,现在是由对比项线程来开启噪音检测线程,因为报警、录制报警文件,检测时段和对比项信息绑定太深了,
  19. 所以,这个线程所有权归到对比项线程中,因为噪音检测动态库检测速度很快,即使同一个通道多次开启噪音检测线程,
  20. 也不会有太大影响,噪音检测线程会根据对比项,已有的函数没有删除,依旧保留
  21. 噪音判断逻辑
  22. 1、每次检测噪音时,都会检测左右声道的噪音,如果有一个声道有噪音,就认为是噪音
  23. 2、假设设置的噪音检测持续次数是10次,设置的百分比是0.8,10次里有8个是噪音,就判断为噪音
  24. 3、噪音预警,如果连续n次都是噪音,就认为是噪音预警
  25. 4、噪音恢复,连续检测次数中低于设置的百分比就认为噪音恢复了
  26. */
  27. class NoiseDetectThread : public BaseCalculateThread
  28. {
  29. public:
  30. NoiseDetectThread(CalculateThreadInfo_t& threadInfo);
  31. ~NoiseDetectThread() override;
  32. /* 获取通道信息 */
  33. const OneSoundCardPCMInfo_t& getRoadInfo() const { return m_roadInfo; }
  34. /* 获取当前噪音结果 */
  35. bool isNoise() const { return m_isNoise.load(); }
  36. /* 获取是否噪音预警 */
  37. bool isNoiseWarning() const { return m_isNoiseWarning.load(); }
  38. /* 设置是否在检测时间段内 */
  39. void setInDetectPeriod(bool isInDetectPeriod) { m_isInDetectPeriod.store(isInDetectPeriod); }
  40. private:
  41. /* 这两个函数私有化,不再使用 */
  42. /* 开启对比项通道的噪音报警功能 */
  43. // void startCompareItemNoiseAlarm(const int itemID, const QString strName, const CompareItemRoadInfo_t& compareItemRoadInfo);
  44. /* 关闭对比项通道的噪音报警功能 */
  45. // void stopCompareItemNoiseAlarm(const int itemID, const QString strName, const CompareItemRoadInfo_t& compareItemRoadInfo);
  46. protected:
  47. /* 线程功能函数 */
  48. void task() override;
  49. /* 初始化数据 */
  50. bool initData() override;
  51. /* 清理数据 */
  52. void clearData() override;
  53. private:
  54. /* 调用动态库检测噪音 */
  55. bool detectNoise();
  56. /* 保存结果,不再使用 */
  57. // void saveResult();
  58. /* 新的保存结果函数,只有一个对比项信息 */
  59. void saveResultOnlyOneItem();
  60. /* 结束报警 */
  61. void endAlarm();
  62. private:
  63. OneSoundCardPCMInfo_t m_roadInfo; /* 录音通道编号 */
  64. std::string m_roadName; /* 录音通道名称 */
  65. CreateWAVThread* m_pThreadWav = nullptr; /* WAV小文件生成线程指针 */
  66. CreateRecordFileThread * m_pThreadCreateAlarm = nullptr; /* 生成报警文件的线程 */
  67. std::atomic_bool m_isInDetectPeriod = true; /* 是否在检测时间段内 */
  68. NoiseDetectBaseConfig_t m_baseNoiseDetectConfig;/* 噪音检测的基础配置 */
  69. NoiseDetectParam_t m_noiseDetectParam; /* 噪音检测参数,这个是从数据库中读取过来的 */
  70. AudioLeftRightData m_leftRightData; /* 左右声道数据 */
  71. /* 计算的结果变量 */
  72. bool m_currentIsNoise = false; /* 当前是否检测到噪音 */
  73. /* 结果 */
  74. std::atomic_bool m_isNoiseWarning = false; /* 噪音预警 */
  75. std::atomic_bool m_isNoise = false; /* 是否检测到噪音 */
  76. bool m_isNoiseLast = false; /* 上一次的噪音检测结果 */
  77. /* ------------------------------------ 噪音检测的一些参数 ------------------------------------ */
  78. /* 噪音检测动态库需要的参数,这些是默认参数,实际启动后会从数据库中获取,就是 NoiseDetectParam_t 中的参数 */
  79. const std::vector<std::string> m_window_params = {"tukey", "0.25"};
  80. double m_sample_rate = 48000; /* 采样率 */
  81. double m_silence_threshold = -60.0; /* 静音检测阈值 */
  82. double m_db_threshold = -70.0; /* 分贝阈值 */
  83. double m_cv_threshold = -70.0; /* 变异系数阈值 */
  84. int m_nperseg = 256; /* 每段样本数 */
  85. int m_noverlap = 32; /* 重叠样本数 */
  86. int m_nfft = 256; /* FFT点数 */
  87. /* ------------------------------------ 报警相关变量 ------------------------------------ */
  88. std::mutex m_mutexAlarm; /* 报警信息互斥锁 */
  89. // std::map<int, AlarmInfo_t> m_mapAlarmInfo; /* 报警信息,key是对比项ID */
  90. RingQueueManualMutex<bool> m_ringQueueIsNoise; /* 噪音检测结果环形队列,保存最近的噪音检测结果 */
  91. AlarmInfo_t m_currentAlarmInfo; /* 当前报警信息 */
  92. };
  93. #endif // NOISEDETECTTHREAD_H_