2013-12-07 2 views
0

Я пытаюсь использовать алгоритм FFT для построения графика простого аудиофайла с величиной против частоты, он работает, но я пытаюсь открыть окно сигнала с целью устранения утечки частоты на боковых лепестках основных частот. Он просто дает мне ошибкуОшибка при попытке открыть аудиофайл с помощью FFT в matlab

здесь код без кадрирования (который работает):

[x,fs]=audioread('E:\voice_hum.wav'); 

x1=x; 

plot_points = 100000; 
h=fft(x1,plot_points); 
freq = h(1:50001); %dump data after half FS 
mag = abs(freq); 
freq = 0.5 * fs *(0:50000)/50000; %frequency on x-axis 
plot(freq,mag) 

вот код, когда я попытался реализации окно Хэмминга:

[x,fs]=audioread('E:\voice_hum.wav'); 

x1 = x(1:100); 

w = hamming(100); 
plot_points = 100000; 

x1 = x1.*w'; %window the signal 
h=fft(x1,plot_points); 
freq = h(1:50001); %dump data after half FS 

mag = abs(freq); 
freq = 0.5 * fs *(0:50000)/50000; 

plot(freq,mag) 

его дает мне эту ошибку:

Error using .* Matrix dimensions must agree.

Error in lab8b (line 12) x1 = x1.*w'; %window the signal

Я немного смущен, кто-то знает, делать?

+0

Рассмотрите возможность использования ['pwelch'] (http://www.mathworks.de/de/help/signal/ref/pwelch.html) вместо того, чтобы выполнять окна и усреднять себя. – nibot

+0

Хотя из имени файла ('lab8b.m') я вижу, что это домашнее задание. (-: – nibot

+0

Да, я очень новичок в этих концепциях, домашняя работа не решала эту проблему, домашняя работа делала все: P (на всякий случай, когда вы думали, что я пытаюсь заставить людей делать домашнее задание для меня) Я не хочу наступать на чьи-то пальцы здесь – shellcoder

ответ

1

Вы используете умножение точек между w (вектор-столбец) и x1 (вектор-столбец, если у вас есть только один аудиоканал).

Для умножения двух векторов с умножением точек (то есть a.*b) они должны иметь одинаковую размерность, в то время как вы используете a.*b', который умножает число на столбец и строку.

Таким образом, вы можете использовать x1'*w (matrix multiplication) или x1.*w с тем же результатом.

+0

Я вижу, я никогда не думал об этом таким образом, что я умножал столбец на ряд, но теперь это имеет смысл – shellcoder

+0

Можете ли вы объяснить, что вы подразумеваете под 'you can либо используйте x1 * w (матричное умножение) или x1. * w с тем же результатом. '? Если' x1' и 'w' являются векторами строк,' x1. * w' даст желаемый результат, но 'x1 * w' будет давать ошибку. Умножение по элементу всегда должно быть явным, за исключением умножения на скаляр. – nispio

+0

Вы правы. Это должно быть умножение между строкой и столбцом, поэтому вам нужно «x1» * w'. Я обновил свой ответ. – alexcasalboni

1

Используйте вместо этого x1 = x1.*w;. Всегда помните, чтобы проверить размер вашего массива перед операцией.

+0

Право. Спасибо, что помогли – shellcoder

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