Вы можете установить все значения 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
является частотой дискретизации.
Это то, что мне нужно, спасибо за ваш ответ! – Karolina