2013-11-21 3 views
2

(Отказ от ответственности: Я думал об этой публикации на math.statsexchange, но нашел подобные вопросы там, которые были перемещены так, поэтому я здесь)«Частота» сдвиг в дискретной FFT в MATLAB

Контекст:

Я использую fft/ifft для определения вероятностных распределений для сумм случайных величин. Так, например, У меня два равномерных распределения вероятностей - в простейшем случае два равномерных распределения на отрезке [0,1].

Таким образом, чтобы получить распределение вероятности для суммы двух случайных величин, взятых из этих двух распределений, можно вычислить произведение преобразованных в четыре лица каждой плотности вероятности. Выполняя обратное значение fft на этом продукте, вы возвращаете плотность вероятности для суммы.

Пример:

function usumdist_example() 

    x = linspace(-1, 2, 1e5); 
    dx = diff(x(1:2)); 
    NFFT = 2^nextpow2(numel(x)); 

    % take two uniform distributions on [0,0.5] 
    intervals = [0, 0.5; 
       0, 0.5]; 
    figure(); 
    hold all; 
    for i=1:size(intervals,1) 
     % construct the prob. dens. function 
     P_x = x >= intervals(i,1) & x <= intervals(i,2); 
     plot(x, P_x); 

     % for each pdf, get the characteristic function fft(pdf,NFFT) 
     % and form the product of all char. functions in Y 
     if i==1 
      Y = fft(P_x,NFFT)/NFFT; 
     else 
      Y = Y .* fft(P_x,NFFT)/NFFT; 
     end 
    end 
    y = ifft(Y, NFFT); 

    x_plot = x(1) + (0:dx:(NFFT-1)*dx); 
    plot(x_plot, y/max(y), '.'); 

end 

Мой вопрос, форма полученного вероят. притоны. функция идеальна. Однако ось x не подходит к x, которую я создаю в начале, но сдвигается. В примере пик равен 1,5, тогда как он должен быть 0,5.

Смена меняется, если я, например. добавьте третью случайную переменную или измените диапазон x. Но я не могу понять, как.

Я боюсь, что это может иметь отношение к тому факту, что у меня есть отрицательные значения x, тогда как преобразования Фурье обычно работают во временной/частотной области, где frequencies < 0 не имеют смысла.

Я знаю, что мог найти, например. пик и сдвинуть его в нужное место, но кажется неприятным и подверженным ошибкам ...

Рад о любых идеях!

ответ

1

Проблема в том, что ваше происхождение x равно -1, а не 0. Вы ожидаете, что центр треугольного PDF будет равен 0,5, потому что это вдвое больше значения центра равномерного pdf. Однако правильные рассуждения таковы: центр однородного pdf равен 1,25 над вашим минимальным x, и вы получите центр треугольника при 2 * 1.25 = 2.5 выше минимального x (то есть, равном 1,5).

Иными словами: хотя исходная ось x (-1,2) свернутая (или БПФ) ведет себя так, как если бы она была (0, 3). Фактически, FFT ничего не знает о вашей оси x; он использует только образцы y. Так как ваша униформа равна нулю для первых выборок, этот нулевой интервал ширины 1 увеличивается до двух раз, когда вы выполняете свертку (или БПФ). Я предлагаю нарисовать свертку на бумаге, чтобы увидеть это (нарисуйте исходный сигнал, отраженный сигнал вокруг оси y, вытесните последний и посмотрите, когда оба начнут перекрываться). Так что вам нужно исправление в x_plot линии для компенсации этой увеличенной ширины интервала нулевой: используйте

x_plot = 2*x(1) + (0:dx:(NFFT-1)*dx); 

plot(x_plot, y/max(y), '.'), а затем даст правильный график:

enter image description here

+0

Awesome! Так как приложение должно быть более общим - действительно ли '2' просто соединяется с числом сверток, а значит, и с pdf-файлами в моем случае? Сначала это кажется так, но просто чтобы быть уверенным ...Едва ли я работал со сверткой, я пока не совсем понял, должен попытаться что-то прочитать. И да, я знал, что fft не знает мои значения «x». Проблема в том, что pdf-файлы не начинаются с первого входа ?! – sebastian

+0

@sebastian Да. Для трех переменных вы должны использовать 'x_plot = 3 * x (1) + (0: dx: (NFFT-1) * dx)' и т. Д. Но: не забудьте увеличить верхний предел оси x, например 'x = linspace (-1, 4, 1e5); '. Причина в том, что свернутый pdf расширяется по мере увеличения числа случайных величин. Это в сочетании с тем фактом, что БПФ является циркулярной сверткой (т. Е. Предполагает, что ваши сигналы являются периодическими), может дать странные результаты (своего рода псевдонимы во временной области). Например, с 3 переменными вы увидите 'x = linspace (-1, 2, 1e5)' дает неправильные результаты. Увеличьте до 'linspace (-1, 4, 1e5)', и вы получите его правильно –

+0

Да, я заметил, что - сигнал обернут вокруг. Реализация продукта fft - это «просто» свертка, возможно, это был бы более легкий подход:> Хотя это кажется значительно медленнее ... – sebastian

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