Свертка wavfile на Matlab - PullRequest
       17

Свертка wavfile на Matlab

0 голосов
/ 26 апреля 2011

Я делаю задание для генерации эха на Matlab с использованием свертки Я не понимаю, что на самом деле делает wavread. Является ли выходной вектор вектором, который я могу использовать в свертке?

Я попытался и получил ошибку «А и В должны быть векторами».

Другой вопрос: если сигнал, который я получаю из волнового файла, - x(t), как я могу получить x(t-4)?

Ответы [ 2 ]

1 голос
/ 26 апреля 2011

Как я уже говорил в своем комментарии, вы, скорее всего, пытаетесь прочитать в многоканальном аудиофайле, и в этом случае wavread, скорее всего, вернет массив NxM, где N - это числоsamples и M - количество каналов.Не могли бы вы опубликовать вывод size(x), где x - это вывод wavread?

В зависимости от того, что вы хотите сделать, вы можете либо усреднить по каналам, чтобы получить один аудио вектор (как моно) как xAvg=mean(x,2);, или вы можете выбрать конкретный канал для работы, например xChannelK=x(:,k);, где 1<=k<=M - выбранный канал.

В ответ на ваш комментарий выше по поводу заполнения нулями, помнитечто в операции свертки между точечным n и точечным m точечным выходом вы получите m+n-1.Скажем, вы хотите свернуть A=[a1,a2,a3] и B=[b1,b2,b3].Сначала вы переворачиваете один из векторов и перемещаете его по другому, одновременно умножая по точкам и добавляя результат на каждом шаге.

Однако, когда вы переворачиваете его, второй вектор торчит в пространстве последовательностей в точках, где другая функция не определена (и наоборот).Поэтому вам нужно дополнить их нулями, пока они не станут одинаковой длины.

Это лучше показать на примере.Первая точка в выводе -

0   0    a1   a2  a3
b3  b2   b1    0   0
--------------------
0 + 0 + a1b1 + 0 + 0  
--------------------

 = a1b1

Здесь мы добавили A и B нулями в точках, где другая не определена.Вторая точка на выходе -

0    a1     a2    a3  0
b3   b2     b1    0   0
-----------------------
0 + a1b2 + a2b1 + 0 + 0
-----------------------

 = a1b2+a2b1

и так далее.Вы должны прочитать статью вики о свертке для получения дополнительной информации.Тем не менее, вам не нужно делать это вручную.MATLAB conv автоматически сделает это за вас.Так что все, что вам нужно сделать, это привести свои векторы в порядок, и все готово.

0 голосов
/ 26 апреля 2011

Да, wavread выдает вектор для вывода (используйте справку Matlab или введите «docsearch wavread» из окна командной строки).Вы также можете перепроверить, используя функцию isvector (x).

Векторы Matlab используют индексирование для определения местоположения в векторе, здесь ваш сигнал x.Если вы использовали wavread таким образом:

x = wavread(*filename*)

, тогда x можно вызвать как x, или x (:), или x (1: end).Это важно, если вы хотите сослаться на x (t-4).Если x (t) можно представить как x (1: end), то каким должен быть x (t-4)?

Однако хитрость в том, что индекс никогда не может быть отрицательным значением, поэтому нельзя просто сказать, что x (t-4) равно x (-3: end-4).При свертке вам, возможно, придется использовать некоторое заполнение нулями, если это еще не сделано в вашей функции свертки.

Надеюсь, это поможет, и удачи!

...