Проблемы масштабирования с IFFT в Matlab

Я изучаю IFFT в Matlab, применяя его к Gaussian. Согласно таблицам Википедии пара преобразования Фурье будет

F(w) = sqrt(pi/a) * exp(-w^2/(4a))

по частоте, и

f(t) = exp(-at^2)

во время. Я изменил код в предыдущем вопросе плюс Ответ Криса Луенго на выполнение этого IFFT.

a = 0.333;

ts = 1e4; % time sampling
L = 1000*ts; % no. sample points
ds = 1/ts;
f = -floor(L/2):floor((L-1)/2); % freq vector
f = f/ts;

w = 2*pi*f; % angular freq
Y = sqrt(pi/a)*exp(-w.^2/(4*a));

y = ts*ifftshift(ifft(fftshift(Y)));

t = (-L/2:L/2-1)*ts/L; % time vector

f = exp(-a*t.^2); % analytical solution

figure; subplot(1,2,1); hold on
plot(t,real(y),'.--')
plot(t,real(f),'-')
xlabel('time, t')
title('real')
legend('numerical','analytic')
xlim([-5,5])
subplot(1,2,2); hold on
plot(w,imag(y),'.--')
plot(w,imag(f),'-')
xlabel('time, t')
title('imag')
legend('numerical','analytic')
xlim([-5,5])

Когда я сравниваю результат IFFT с аналитическим выражением, они, похоже, не согласны:

введите описание изображения здесь

Я не уверен, в чем ошибка. Правильно ли я масштабировал IFFT? Есть ли ошибка в том, как я определяю линейную / угловую частоту?

Изменить: По какой-то причине, когда я определяю L=ts^2, аналитические и численные решения, похоже, совпадают (L = количество точек выборки, ts = выборка времени).


person Medulla Oblongata    schedule 22.03.2018    source источник


Ответы (1)


Давайте немного перефразируем, исходя из аналитического решения. У вас есть выборка функции f(t) = exp(-a*t^2), и то, как вы построили аналитический ответ, вы собираете L=1000*ts=1e7 выборки с частотой выборки Ts=ts/L=1e-3. Это означает, что ваша частота дискретизации Fs=1/Ts=1e3.

Поскольку вы хотите сравнить с результатами, полученными с помощью _5 _ / _ 6_, вам следует учитывать цифровые или дискретные частоты, то есть значения, которые вы определяете для своего преобразования, будут соответствовать цифровым частотам.

frd = (-L/2:L/2-1)/L;

Сопоставляя это с угловыми частотами, мы имеем:

w = 2*pi*frd;

Но когда вы пытаетесь вычислить значения, вам также необходимо иметь в виду, что эти частоты должны представлять собой образцы ожидаемого непрерывного временного спектра. Итак, вы масштабируете эти значения по частоте дискретизации:

Y = sqrt(pi/a)*exp(-(Fs*w).^2/(4*a));
y = Fs*ifftshift(ifft(fftshift(Y)));

Когда вы сравниваете аналитические и вычисленные ответы, они теперь совпадают.

Краткий ответ на ваш вопрос, учитывая это, заключается в том, что вы неправильно масштабируете y в конце. Вы масштабируете его на ts, то есть на 1e4, но вам нужно масштабировать его с частотой дискретизации, равной Fs=1e3. Вот почему вы проигрываете в 10 раз.

person CKT    schedule 22.03.2018