qq_41724350 2020-10-18 21:11 采纳率: 0%
浏览 36

高人帮我看一下我自己写的离散傅里叶ni变换跟matlab自带的ifft有什么区别?

MATLAB

我自己写的离散傅里叶ni变换跟matlab自带的ifft有什么区别?

function xnp = mydft_shifted( xk )

    N = length(xk);
    n=-N/2:(N/2-1);      %相当于k从-N/2~(N/2)-1
    WN=exp(1i*2*pi*n/N);
    for i=1:N
        temp=0;
        for k=1:N          %k从-N/2~(N/2)-1
            temp=temp+xk(k)*(WN(i)^(k-1+1/2));%%%这个i用来从WN中取值
        end%x(n) = (1/N) sum  X(k)*exp( j*2*pi*(k-1)*(n-1)/N), 1 <= n <= N.
        xnp(i)=1/N*temp;%
    end

end

这样的嵌套循环子函数特别特别的慢,在使用时我将此嵌套循环改成数组运算后有好转但仍特别慢。但是如果换成matlab自带的ifft后运算结果不一样,而且最终出图误差较大,高人可否看一下我写的这个跟ifft有什么区别吗

  • 写回答

1条回答 默认 最新

  • 你知我知皆知 2024-07-25 02:39
    关注

    以下回答参考 皆我百晓生券券喵儿 等免费微信小程序相关内容作答,并由本人整理回复。

    你的代码在计算离散傅立叶变换(DFT)时采用了非对称的循环结构,这使得计算变得非常缓慢。

    如果你只是想实现一个简单的DFT,你可以直接使用MATLAB的fft函数来完成,而不需要任何嵌套循环。下面是一个例子:

    x = [1, 2, 3, 4]; % 假设这是一个长度为4的向量
    y = fft(x);
    
    % 使用ifft函数恢复原始信号
    y_inv = ifft(y);
    

    这段代码首先创建了一个包含四个元素的向量x,然后使用fft函数将其转换成复数序列y。最后,它使用ifft函数将复数序列转换回实数序列y_inv,这就是你想要的结果。

    如果你的目的是要实现自己的DFT算法,并且希望优化性能,请考虑以下几点:

    1. 尽可能地减少循环次数。
    2. 尝试使用更高效的数据结构和算法。
    3. 考虑并优化你的函数实现细节,以提高效率。

    如果问题仍然存在,那么可能是你的实现存在问题或者你需要进一步改进你的代码。

    评论

报告相同问题?