【问题标题】:Using GNU Octave FFT functions使用 GNU Octave FFT 函数
【发布时间】:2010-05-08 09:21:20
【问题描述】:

我正在使用 octave 的 fft 函数,但我真的不知道如何缩放它们的输出:我使用以下(非常短的)代码来近似函数:

function y = f(x)
    y = x .^ 2;
endfunction;

X=[-4096:4095]/64;
Y = f(X);
# plot(X, Y);

F = fft(Y);
S = [0:2047]/2048;

function points = approximate(input, count)
    size    = size(input)(2);
    fourier = [fft(input)(1:count) zeros(1, size-count)];
    points  = ifft(fourier);
endfunction;

Y = f(X); plot(X, Y, X, approximate(Y, 10));

基本上,它所做的就是获取一个函数,计算一个区间的图像,fft-it,然后保留一些谐波,然后对结果进行 ifft。然而,我得到了一个垂直压缩的图(输出的垂直比例是错误的)。有什么想法吗?

【问题讨论】:

    标签: fft octave gnuplot


    【解决方案1】:

    您正在丢弃变换的后半部分。对于实值输入,变换是 Hermitian 对称的,您必须保留这些线。试试这个:

    function points = approximate(inp, count)
        fourier = fft(inp);
        fourier((count+1):(length(fourier)-count+1)) = 0;
        points  = real(ifft(fourier)); %# max(imag(ifft(fourier))) should be around eps(real(...))
    endfunction;
    

    由于数值计算错误,逆变换总是会有一些微小的虚部,因此real提取。

    注意inputsize 是Octave 中的关键字;用你自己的变量来破坏它们是一个很好的方法来解决非常奇怪的错误!

    【讨论】:

    • 太好了,谢谢!我现在明白了。你知道关于 fft 的优秀文档来源吗?
    【解决方案2】:

    你可能做错了。您删除了代码中的所有“负”频率。您应该同时保留正负低频。这是python中的代码和结果。该情节具有正确的比例。

    alt text http://files.droplr.com/files/35740123/XUl90.fft.png

    代码:

    from __future__ import division
    
    from scipy.signal import fft, ifft
    import numpy as np
    
    def approximate(signal, cutoff):
        fourier = fft(signal)
        size = len(signal)
        # remove all frequencies except ground + offset positive, and offset negative:
        fourier[1+cutoff:-cutoff] = 0
        return ifft(fourier)
    
    def quad(x):
        return x**2
    
    from pylab import plot
    
    X = np.arange(-4096,4096)/64
    Y = quad(X)
    
    plot(X,Y)
    plot(X,approximate(Y,3))
    

    【讨论】:

    • Olivier,你摇滚 :) 这正是我所需要的,谢谢!
    • 虽然,负截止下标有什么用?
    • CFP,很高兴你喜欢它! -cutoff 表示“截止到最后”索引,即,-1 表示最后一个索引。所以切片[size/2,-cutoff] 意味着留下一半,除了cutoff 最后。更简洁的方法是:fourier[cutoff+1:-cutoff]=0.
    • 我不得不使用scipy.fftpack 而不是scipy.signal。我得到了/usr/local/lib/python2.7/dist-packages/numpy/core/numeric.py:460: ComplexWarning: Casting complex values to real discards the imaginary part return array(a, dtype, copy=False, order=order)。而且它没有绘制任何东西(您可能应该添加show())。
    • 为什么要计算size
    猜你喜欢
    • 1970-01-01
    • 2019-10-04
    • 1970-01-01
    • 2021-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-20
    相关资源
    最近更新 更多