Источник несовместимых матриц в коде Matlab Voicebox

Я использую функцию melcepst в подпрограмме Matlab Voicebox для получения MFCC из звукового файла. Ниже приведен код, который я использую, с примером файла wav. Мои фактические файлы - это 1-секундные файлы wav, сэмплированные с частотой 48000 Гц и глубиной 24 бита. Исходный код для melcepst можно найти здесь http://www.ee.ic.ac.uk/hp/staff/dmb/voicebox/doc/voicebox/melcepst.html, на который я буду ссылаться.

Загрузить wav-файл:

load handel.mat 
filename = 'handel.wav'
[y,Fs] = audioread('handel.wav');
audiowrite(filename, y, Fs)

Запустите функцию melcepst. Файл имеет частоту дискретизации 8192 Гц. Я указываю окно Хэмминга ('M'), 12 кепстральных коэффициентов, 30 треугольных фильтров, длину кадра 245, приращение кадра 81 выборку и фильтры самого низкого и самого высокого уровня по умолчанию.

[c,tc] = melcepst('handel.wav', 8192, 'M', 12, 30, 245, 81, 0, 0.5)

Это возвращает следующую ошибку:

Error using max
Matrix dimensions must agree.

Error in melcepst (line 111)
y=log(max(m*abs(f(a:b,:)),ath));

Более глубокое изучение исходного кода melcepst позволяет выявить источник проблемы (строка 111): Начиная со строки 101:

[z,tc]=enframe('handel.wav',0.54-0.46*cos(2*pi*(0:245-1)'/(245-1)),81)
f=rfft(z.');
[m,a,b]=melbankm(30,245,8192,0,0.5,'t');
pw=f(a:b,:).*conj(f(a:b,:));
pth=max(pw(:))*1E-20;
ath=sqrt(pth);
y=log(max(m*abs(f(a:b,:)),ath));

Матрицы, использованные в последней строке, ath и m*abs(f(a:b,:)), несовместимы. ath — это пустой столбец двойного вектора 0 x 1, а m*abs(f(a:b,:)) — пустой столбец двойного вектора 30 x 0.

Я понимаю, в чем проблема, но мне непонятно, почему эта проблема вообще возникает, если только в исходном коде нет ошибки (что кажется маловероятным). Есть ли проблема ранее в коде, которая позже дает несовместимые матрицы? Я пробовал это с моими собственными файлами и их собственными переменными, которые немного отличаются от тех, которые я указал для этого примера, и я все еще возвращаю ту же ошибку. Любые идеи очень приветствуются.


person Amanda S    schedule 11.05.2018    source источник
comment
Я предполагаю, что вы изменили имена переменных на их значения в отрывке кода. Если ath пусто, то pw тоже, а это значит, что либо f пусто, либо a>b. Может ли это быть вызвано вашим выбором входных аргументов?   -  person Cris Luengo    schedule 12.05.2018
comment
@CrisLuengo Спасибо за предложение. f действительно пуст, как и z, который он вызывает. Мои входные аргументы должны быть правильными, и я также получаю ту же ошибку, когда использую все аргументы по умолчанию. Я продолжал работать над этим и думаю, что моя проблема заключалась просто в том, что я использовал полный звуковой сигнал (исходный файл wav) в качестве входного речевого сигнала, а не просто вектор сэмплов. Таким образом, в приведенном выше примере, если я ввожу y вместо handel.wav в функцию melcespt, код работает нормально. Задача решена! [c,tc] = melcepst(y, 8192, 'M', 12, 30, 245, 81, 0, 0.5)   -  person Amanda S    schedule 14.05.2018
comment
Аманда, подумайте о том, чтобы закрыть вопрос или опубликовать свое решение в качестве ответа. Спасибо!   -  person Cris Luengo    schedule 14.05.2018


Ответы (1)


Я продолжал работать над этим и думаю, что моя проблема заключалась просто в том, что я использовал полный звуковой сигнал (исходный файл wav) в качестве входного речевого сигнала, а не просто вектор сэмплов. Таким образом, в приведенном выше примере, если я ввожу y вместо handel.wav в функцию melcespt, код работает нормально: [c,tc] = melcepst(y, 8192, 'M', 12, 30, 245, 81, 0, 0.5);

Задача решена.

person Amanda S    schedule 14.05.2018