Среднее среднеквадратичное значение 3D-аудиосигнала в Python

Я совсем новичок в программировании и Python. Я работаю над проектом, в котором я создал банк фильтров Auditory с двумя банками фильтров Gammatone. Теперь я получил матрицу 39x10x8545. Я хочу рассчитать среднее значение среднеквадратичной энергии по оси времени (по 8545), чтобы уменьшить размерность сигнала. Может ли кто-нибудь предложить мне лучший способ сделать это эффективно в Python, потому что я не могу позволить себе много памяти из-за очень большого аудиосигнала. Заранее спасибо.


person Nikki_Champ    schedule 15.08.2014    source источник
comment
Я попытался просто усреднить сигнал, используя numpy.mean по оси времени, но я не уверен, что они оба одинаковы.   -  person Nikki_Champ    schedule 15.08.2014
comment
Если оба, что одинаковы?   -  person Tom Dalton    schedule 15.08.2014
comment
Среднее значение и среднеквадратичное значение... Я знаю, что они не совпадают, но не знаю, как работает numpy.mean. Теперь я ясно   -  person Nikki_Champ    schedule 15.08.2014


Ответы (2)


Среднеквадратичное значение сигнала представляет собой среднеквадратичное значение, которое не совпадает со средним значением. Поэтому вам необходимо выполнить расчет RMS.

math.sqrt(numpy.mean(x*x))

На этом сайте есть несколько других страниц, на которых это обсуждается более подробно: -arrays-of-numpy">здесь, здесь, здесь

person Dave Moffat    schedule 15.08.2014
comment
Привет, Дэйв ... Спасибо за ответ, но, как я уже сказал, мне нужно найти среднее значение по 3-й оси в трехмерном массиве. Я все равно попробую. - person Nikki_Champ; 15.08.2014
comment
Конечно, в python вы можете выбрать первую строку матрицы с помощью x[1,:], если это массив np, так что это может быть расширено до любого размера матрицы, которая у вас есть. Как вы строите свой массив, поскольку я считаю, что стандартный модуль массива Python не поддерживает многомерность. - person Dave Moffat; 15.08.2014
comment
Так и есть, у меня была матрица 39х10х8495 как я и говорил. Я просто использовал уравнение, которое вы мне дали, чтобы найти среднеквадратичное значение всех 8495 элементов, а затем поместил их в 39x10. Это работает, благодаря вам. - person Nikki_Champ; 16.08.2014

Я хотел бы сам ответить на этот вопрос, основываясь на ответе Джимоффата. Я попробовал его ответ, но обнаружил, что numpy.pow() дает очень медленные результаты. Поэтому я попытался использовать

math.sqrt(numpy.mean(x**2)) 

Это дало мне более быстрые результаты. Я понимаю, что math.pow() работает медленно, так как он должен учитывать многие другие вещи, такие как дробные степени и другие вещи, четко обсуждаемые здесь. Контекст важен, так как я уверен, что у меня будут только целые степени, а точнее «2».

person Nikki_Champ    schedule 17.08.2014