没有贝壳的寄居蟹 2024-05-28 15:12 采纳率: 10%
浏览 65

FPGA全相位fft仿真与matlab误差大

fpga实现全相位fft求两路信号相位差,波形正确可是做fft的结果不对
全相位实现流程:
1,构成一个N点的汉宁窗。
2,汉宁窗对自己求卷积,得到2N-1点的卷积窗。
3,求2N-1点的卷积窗的和。
4,将卷积窗的每一项除以卷积窗的和,得到2N-1点的归一化卷积窗。
5,将数据的1:2N-1项和归一化卷积窗相乘,得到加窗的2N-1项。
6,将第1项和N+1项,第2项和N+2项 ... 第N-1项和第2N-1项相加,得到经过全相预处理的N点序列。
接下来就只需要进行FFT,就可以得到apFFT的结果。

这是matlab和fpga仿真结果图,汉宁窗双窗和信号相乘后的图像

img

img


相乘后的信号间隔N相加后的图像

img


img

  • 写回答

2条回答 默认 最新

  • 专家-赤兔[在线] 优质创作者: 编程框架技术领域 2024-05-28 15:12
    关注

    引自免费微信小程序:皆我百晓生

    从您提供的信息来看,您的FPGA FFT实现可能存在问题,导致与MATLAB中的结果存在较大差异。为了定位问题,我们可以从几个关键步骤入手进行排查。下面我会逐步指导您检查并修复可能的问题。

    首先,确保在FPGA和MATLAB中使用的汉宁窗函数是相同的。在MATLAB中,可以使用hanning函数创建汉宁窗,而在FPGA中,您需要手动编写汉宁窗系数的生成逻辑。确保两个平台上的汉宁窗系数完全一致。

    例如,在MATLAB中创建汉宁窗:

    win = hanning(2*N - 1);
    

    然后,在FPGA中,您可以使用以下Verilog代码计算汉宁窗(这里仅提供思路,具体实现可能需要根据实际硬件结构调整):

    module hamming_window(
        input clk,
        input rst_n,
        output reg [N*32-1:0] win_reg
    );
    
    localparam N = 256; // 选择适当的N值
    reg [N*32-1:0] win;
    
    always @(posedge clk or negedge rst_n) begin
        if (~rst_n) begin
            win <= 0;
            win_reg <= 0;
        end else begin
            // 计算汉宁窗
            for (int i = 0; i < N; i++) begin
                win[i*32+31:i*32] = 0.54 - 0.46*cos(2*pi*i/(N-1));
            end
            win_reg <= win;
        end
    end
    
    endmodule
    

    接下来,检查卷积操作是否正确。在MATLAB中,您可以使用conv函数进行卷积,而在FPGA中,您可能需要实现一个硬件卷积模块。确保两个平台上的卷积结果相同。

    然后,计算卷积窗的和,并进行归一化。在MATLAB中,这可以通过简单的向量运算完成,在FPGA中,您可能需要设计一个累加器模块以及除法电路(可能使用分数除法)。

    在对信号进行加窗和相加处理后,比较MATLAB和FPGA得到的结果是否一致。如果不一致,可能是加窗或相加过程中的错误。检查相关代码和逻辑,确保每个步骤的正确性。

    最后,执行FFT。确保您的FPGA FFT实现与MATLAB的DFT算法(快速傅里叶变换)匹配。对于较小的数据长度(如512),您可以使用传统的基2 FFT算法。MATLAB提供了fft函数,而FPGA实现则需要设计一个自定义的FFT IP核或模块。注意,由于全相位FFT涉及到额外的处理,确保您的FPGA FFT模块考虑到了这些特殊需求。

    如果您仍然遇到困难,可以提供具体的FPGA代码或更多细节,这样我可以更深入地帮助您分析和调试问题。同时,确保在FPGA上运行时,采样率、触发时间等参数与MATLAB中保持一致,因为这些因素也可能影响最终结果。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 5月28日