2013-03-26 3 views
0

Моя проблема заключается в получении исходного сигнала из амплитудного спектра (fft) на основе инверсного fft, но только для некоторого частотного диапазона ex. 8-12 Гц. Может ли кто-нибудь мне помочь? Я пытаюсь использовать:обратное быстрое преобразование Фурье для диапазона частот

xdft=fft(x); 
ixdft=ifft(xdft(a:b)), %where xdft(a:b) is |Y(f)| for freq 8-12 Hz. 

Но он не хочет работать.

ответ

3

Вы можете установить все значения xdft к нулю, за исключением тех, кого вы хотите, то есть

xdft = fft(x); 
xdft = xdft(1:ceil(length(xdft)/2)); 
xdft(1:a) = 0; 
xdft(b+1:end) = 0; 
ixdft = ifft(xdft, 'symmetric'); 

Причина я взял только половину исходных данных FFT'd является то, что ваш результат будет симметричным относительно Fs/2 (где Fs - частота дискретизации), и если вы не делаете то же самое с частотами по обе стороны от центра, вы получите сложный сигнал. Вместо того, чтобы делать одно и то же с обеих сторон вручную, я только что сделал одну сторону, изменил ее и сказал ifft, что она должна восстанавливать данные для полного диапазона частот, добавляя зеркальное изображение того, что вы передаете; это делается путем вызова его с помощью опции 'symmetric'.

Если вам нужно выяснить, какие a и b должны быть на некоторой частоте, вы можете сначала создать вектор частот, на которых вы выполнили БПФ, а затем найти те частоты, которые находятся в пределах вашего диапазона, например :

xdft = fft(x); 
xdft = xdft(1:ceil(length(xdft)/2)); 
f = linspace(0, Fs/2, length(xdft)); 
keepInd = f >= 8 & f <= 12; % Keep frequencies between 8 and 12 Hz 
xdft(~keepInd) = 0; 

Обратите внимание, что я на самом деле опустил использование двух переменных a и b вообще в этом примере, и выбрал для логической индексации, и что Fs является частотой дискретизации.

+0

Это то, что мне нужно, спасибо за ваш ответ! – Karolina