2014-05-04 5 views
3

В Matlab:Как можно реализовать функцию MATLAB wavread() в Python?

[s, fs] = wavread(file); 

Поскольку значение каждого элемента в S находится в пределах от -1 до 1, поэтому мы импортировать scikits.audiolab используя свою wavread функцию.

from scikits.audiolab import wavread 
s, fs, enc = wavread(filename) 

Но когда я красный и тот же файл ввода Wav, значение х в Matlab и Python были совершенно разные. Как я могу получить тот же результат, что и в MATLAB?

p.s. WAV-файл - это простой 16-битный файл с одним каналом, отснятый на частоте 44100 Гц.

+0

Ну, что такое тип данных 's', т. Е.' Type (s) '? Как насчет сравнения с опцией ''native' 'в' wavread' Matlab? – horchler

ответ

4

Функция Matlab wavread() возвращает нормализованные данные по умолчанию, т. Е. Масштабирует все данные в диапазоне от -1 до +1. Если ваш аудиофайл находится в 16-битном формате, тогда значения необработанных данных будут находиться в диапазоне от -32768 до +32767, что должно соответствовать диапазону, возвращаемому scikits.audiolab.wavread().

Для нормализации этих данных в пределах от -1 до +1 все, что вам нужно сделать, это разделить массив данных по значению с максимальной величиной (с использованием numpy модуля в данном случае):

from scikits.audiolab import wavread 
import numpy 

s, fs, enc = wavread(filename) # s in range -32768 to +32767 
s = numpy.array(s) 
s = s/max(abs(s))    # s in range -1 to +1 

Обратите внимание, что вы также можете использовать опцию 'native' с функцией Matlab, чтобы возвращать ненормированные значения данных, как было предложено horchler в его комментарии.

[s, fs] = wavread(file, 'native'); 
+0

Я больше не могу тестировать вещи в MATLAB, но я думаю, что он не масштабирует значения, как вы говорите. Я думаю, что он масштабирует максимальные и минимальные значения (а не максимальные и минимальные значения) до -1 и +1 соответственно. Поэтому вместо деления на max (abs (s)) вы можете разделить на (2 ** 15 - 1) для 16-битных выборок. Я еще не уверен, как динамически искать максимальное нормирующее значение в случае возникновения других бит-глубин. Это особенно важно, если вы загружаете разные файлы и должны сопоставлять уровни. –

+0

Максимальное значение типа данных можно получить с помощью 'numpy.iinfo (s) .max'. – Rob

+0

Примечание: для некоторых приложений кажется более распространенным деление на 2^(n_bits - 1) вместо максимального значения. См. Http://stackoverflow.com/questions/2060628/reading-wav-files-in-python – Quetzalcoatl

Смежные вопросы