【问题标题】:"Frequency" shift in discrete FFT in MATLABMATLAB中离散FFT的“频率”偏移
【发布时间】:2013-11-21 10:00:46
【问题描述】:

(免责声明:我曾考虑在 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 &lt; 0 没有意义。

我知道我可以找到例如峰值并将其转移到适当的位置,但看起来很讨厌且容易出错......

很高兴有任何想法!

【问题讨论】:

    标签: matlab fft ifft


    【解决方案1】:

    问题是您的 x 原点是 -1,而不是 0。您希望三角形 pdf 的中心位于 0.5,因为这是统一 pdf 中心值的两倍。但是,正确的推理是:uniform pdf 的中心比最小 x 高 1.25,而三角形的中心在最小 x 之上 2*1.25 = 2.5(即 1.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), '.') 会给出正确的图表:

    【讨论】:

    • 太棒了!由于应用程序应该更通用 - 2 真的只是连接到卷积的数量,因此在我的情况下是 pdf 吗?起初看起来是这样,但为了确定......我几乎没有使用卷积,我还没有真正了解背景,应该尝试在某个地方阅读它。是的,我知道 fft 不知道我的 x 值。问题是,pdf不是从第一个输入开始的?!
    • @sebastian 是的。对于 3 个变量,您将使用 x_plot = 3*x(1) + (0:dx:(NFFT-1)*dx) 等。但是:请务必增加您的 x 轴上限_,例如 x = linspace(-1, 4, 1e5);。原因是随着随机变量数量的增加,卷积后的 pdf 会变得更宽。再加上 FFT 是 循环 卷积(即假设您的信号是周期性的)这一事实,可能会产生奇怪的结果(一种时域混叠)。例如,对于 3 个变量,您会看到 x = linspace(-1, 2, 1e5) 给出错误的结果。增加到linspace(-1, 4, 1e5),你会做对的
    • 是的,我注意到了 - 信号被环绕。意识到 fft 的乘积“只是”卷积,也许这会是更简单的方法:> 虽然它似乎明显慢得多......
    猜你喜欢
    • 1970-01-01
    • 2011-12-16
    • 1970-01-01
    • 1970-01-01
    • 2021-01-26
    • 2013-12-04
    • 2018-01-07
    • 2020-03-03
    • 1970-01-01
    相关资源
    最近更新 更多