Не отвечает ли пиковое значение ответа? Если вы смотрите на сигнал с хорошего АЦП, окружающий уровень должен быть в единицах 1 или 10, тогда как голос или музыка попадут в тысячи отсчетов. Есть ли какой-то автоматический контроль усиления, который делает эту стратегию неработоспособной?
Если вам нужно что-то более сложное, соотношение между пиком и RMS может быть немного более надежным, чем просто RMS-уровень (RMS = stddev). Чистый шум будет иметь отношение около 3-5, в то время как синусоиды, например, имеют отношение пика к RMS 1,4. Однако вы можете получить больше дискриминации, посмотрев на сигнал spectrum. Статичность обычно спектрально гладкая или ровная, а голос и музыка спектрально структурированы. Таким образом, преобразование Фурье может быть тем, что вы ищете. Предполагая сигнальную х, который содержит, скажем, 0,5 секунды стоит данных, вот некоторые Matlab код:
Sx = fft(x .* hann(length(x), 'periodic'))
HANN функция применяется окно Hann для уменьшения утечек спектра, в то время как функция FFT быстро вычисляет преобразование Фурье. Теперь у вас есть несколько вариантов. Если вы хотите, чтобы определить, состоит ли сигнал х статическим или голос/музыки, принять пик соотношения RMS спектра:
pk2rms = max(abs(Sx))/sqrt(sum(abs(Sx).^2)/length(Sx))
Я бы ожидать чисто статический иметь соотношение пики RMS около 3- 5 (опять же), в то время как голос/музыка будет по крайней мере на порядок выше. Это использует тот факт, что чистый белый шум имеет одинаковую «структуру» во временной и частотной областях.
Если вы хотите получить численную оценку уровня шума, вы можете рассчитать мощность в Sx с течением времени, используя в среднем:
Gxx = ((k-1)*Gxx + Sx.*conj(Sx))/k
С течением времени пики Gxx должны приходить и уходить, но вы должны увидеть постоянное минимальное значение, соответствующее уровню шума. В общем, звуковые спектры легче смотреть на шкалу dB (log vertical).
Некоторые примечания:
1. Я выбрал 0,5 секунды для длины x, но я не уверен, какое оптимальное значение здесь. Если вы выберете слишком короткое значение, x не будет иметь много структуры. В этом случае компонент постоянного тока сигнала будет иметь много энергии. Я ожидаю, что вы все равно сможете использовать пик для RMS-дискриминатора, хотя, если вы сначала выбросите бит в Sx, соответствующий DC.
2. Я не уверен, какое хорошее значение для k есть, но это уравнение соответствует exponential averaging. Вероятно, вы можете экспериментировать с k, чтобы определить оптимальное значение. Это может работать лучше всего с коротким x.