2015-07-31 3 views
2

Я хочу принять БПФ из 10 измерений. Это означает, что у меня есть 10 строк в моих данных, каждая строка имеет размерность [1 * 2000]. В приведенном ниже коде я делаю неправильный путь. Может ли кто-нибудь сказать мне, какую ошибку я делаю?Преобразование Фурье нескольких строк

load('fb2010');         % loading the data 
x = fb2010(3:1:15,:); 
y_filt = filter(b,a,x);       % filtering the received signal 
%%%%%%% Fourier transform 
nfft = length(y_filt); 
for i = 1:10 
res(i,:) = fft(y_filt(i,:),nfft)/ nfft;   %%%% Taking first fft and normalizing it 
end 
res2 = res(:,1:nfft/2+1);     %%%% taking single sided spectrum 
f = fs/2*linspace(0,1,nfft/2+1);   % choosing correct frequency axes 
figure, plot(f,abs(res2)); 
+1

Что не так с вашим кодом? – TDG

+1

это дает неверный fft. Используя этот цикл for, некоторые строки имеют правильный fft, а некоторые из них имеют неправильные результаты fft. –

ответ

3

Функция filter по умолчанию передает передаточную функцию по первому измерению. Таким образом, вы фильтруете свои столбцы вместо своих строк. Чтобы получить правильный результат, используйте следующую строку:

filter(b,a,x,[],2); 

Затем вы можете опустить петлю с помощью fft с третьим аргументом, чтобы определить размер он работает вместе. Это будет следующая строка:

res = fft(y_filt,nfft,2); 
+1

ahh ok. Спасибо Мэтт: D. Я попробую, как вы уже упоминали. –

+1

Yup, это работает. Еще раз спасибо :) –

2

doc fft:

Y = fft(X,n,dim) , где тусклым является измерение. Полагаю, вы хотите dim = 2. Это избавится от цикла и должно работать. Я просто использовал его сам.

+0

Почему 2? мой dimesion каждой строки 1 * 2000, и у меня есть такие 10 строк. –

+0

Извините, я был слишком быстр и устал сегодня утром. Вы правы, работает fft, это фильтр, который дает проблему. Тем не менее, этот аргумент 'dim' избавит вас от использования цикла. См. Ответ Мэтта! – TheodorBecker

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