您能以编程方式检测白噪声吗?
戴尔Streak被发现有一个FM收音机,它具有非常粗糙的控制。默认情况下,“扫描”不可用,所以我的问题是,有谁知道如何在Android上使用Java时“收听”FM收音机,因为我们通过频率范围迭代检测白噪声(或良好的信号),以便像普通收音机的寻道功能一样工作?
戴尔Streak被发现有一个FM收音机,它具有非常粗糙的控制。默认情况下,“扫描”不可用,所以我的问题是,有谁知道如何在Android上使用Java时“收听”FM收音机,因为我们通过频率范围迭代检测白噪声(或良好的信号),以便像普通收音机的寻道功能一样工作?
我已经在这个特定领域做了一些实际工作,我建议(如果你有一点时间)在诉诸fft'ing之前尝试一些实验。pcm流可以非常复杂和微妙地解释(根据高质量的过滤和重采样),但也可以出于许多目的实际上被视为摆动线的路径。
白噪声是不可预测的线路抖动,其强度(均方根,绝对平均值)从不少。声学内容是反复摆动和偶尔的惊喜(跳跃,跳跃):]
信号的非噪声类内容可以通过在pcm流的运行窗口中执行快速计算来估计。
例如,噪声的导数的绝对积分值往往高于非噪声。我认为这是学术上的说法:
loop(n+1 to n.length)
{ sumd0+= abs(pcm[n]);
sumd1+= abs(pcm[n]-pcm[n-1]);
}
wNoiseRatio = ?0.8; //quite easily discovered, bit tricky to calculate.
if((sumd1/sumd0)<wNoiseRatio)
{ /*not like noise*/ }
此外,在~16至~30个样本的白噪声样本上的运行绝对平均值往往比声学信号的变化要小:
loop(n+24 to n.length-16)
{ runAbsAve1 += abs(pcm[n]) - abs(pcm[n-24]); }
loop(n+24+16 to n.length)
{ runAbsAve2 += abs(pcm[n]) - abs(pcm[n-24]); }
unusualDif= 5; //a factor. tighter values for longer measures.
if(abs(runAbsAve1-runAbsAve2)>(runAbsAve1+runAbsAve2)/(2*unusualDif))
{ /*not like noise*/ }
这涉及白噪声在足够大的跨度上如何趋向于非零星,以平均其熵。声学内容是零星的(局部功率)和循环的(重复功率)。简单的测试对较低频率的声学内容做出反应,并可能被高频内容淹没。有一些简单的应用低通滤波器可能会有所帮助(毫无疑问还有其他适应)。
此外,均方根可以除以平均绝对和,从而提供另一个应该特定于白噪声的比率,尽管我现在无法弄清楚它是什么。信号导数的比率也会有所不同。
我认为这些是简单的公式化噪声特征。我相信还有更多。很抱歉没有更具体,这是模糊和不精确的建议,但对fft的输出执行简单的测试也是如此。为了更好的解释和更多的想法,也许可以查看维基百科上熵和随机性的统计和随机(?)测量等。