我有一些信号的 fft,并且想要粗略估计噪声水平,以便为我们的峰值检测算法选择合适的阈值。通常,fft 主要包含带有少量峰值的噪声(与所述噪声相比,这些峰值通常相当高)。作为参考,我附上了一个非常典型的 fft 的截图:
现在到我提出的噪声水平估计算法,它基于以下假设:
- 我想要的是fft的均值和标准差
- 如果 fft 仅包含(高斯)噪声,则中值将非常接近均值
- 峰值不应过多影响中位数
- 均值和标准差与样本的顺序无关
- 因此我可以对 fft 进行排序并且仍然得到相同的结果
所以得到的算法如下所示:
- 对 fft 进行排序(升序)
- 计算排序后的fft的均值和标准差,但是一旦均值超过中位数就停止
- 使用计算的平均值和标准偏差来选择峰值检测阈值
- 利润?
我已经在一些典型信号上测试了这个算法,结果似乎相当不错(请记住,我不需要确切的噪声水平,只需要一些稳健的东西来选择合适的阈值)。排序当然有点贵,但我不希望噪音水平变化太大,所以我不需要为每个 fft 运行它。
话虽如此,算法本身感觉有点“错误”,因为我没有问实际问题“没有峰值,平均值和标准偏差是多少?” 而是“如果平均值是 X,标准差是多少?”。
那么您对此有何看法?这类问题有更好的算法吗?(我打赌有)