MATLAB中离散FFT中的“频率”偏移

时间:2013-11-21 10:00:47

标签: matlab fft ifft

(免责声明:我考虑在math.statsexchange上发布此内容,但发现类似的问题已转移到SO,所以我在这里)

背景信息:

我正在使用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 个答案:

答案 0 :(得分:1)

问题是你的x原点是-1而不是0.你希望三角形pdf的中心是.5,因为它是统一pdf中心值的两倍。但是,正确的推理是:均匀pdf的中心比最小x高1.25,并且你得到三角形的中心在最小x(即1.5)之上2 * 1.25 = 2.5。

换句话说:虽然您的原始x轴是(-1,2),但卷积(或FFT)的行为就像(0,3)一样。实际上,FFT对x轴一无所知;它只使用y样本。由于第一个样本的均匀度为零,因此当您进行卷积(或FFT)时,宽度为1的零间隔将被放大到其宽度的两倍。我建议在纸上绘制卷积来看这个(绘制原始信号,反射y轴的信号,取代后者,看看两者何时开始重叠)。因此,您需要在x_plot行中进行校正,以补偿零间隔的增加宽度:使用

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

然后plot(x_plot, y / max(y), '.')会给出正确的图表:

enter image description here