You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

FFT IP Core与Matlab运算结果不符求助及SCALE_SCH参数解析

FFT IP核输出与Matlab结果不符问题求助及SCALE_SCH参数解析

此前我在Xilinx论坛发布过该问题但未获解答,现再次求助。我基于Vivado开发仅包含FFT IP核的RTL Kernel(XO),并通过Vitis将其与负责从内存读取数据并流式传输至IP核的C++ Kernel连接。

输入数据为缩放至-1到1之间的定点正弦波采样值。配置包为24位,已设置N=8、FWD_INV=1(配置包值:000000000000000100000011),但我仍不清楚SCALE_SCH参数的作用,望有人解析。

当前核心问题:通过仿真器确认输入数据流式传输正常、配置包发送正确,但FFT IP核的输出结果与Matlab对同一正弦波的FFT结果完全不同。恳请协助排查问题,并解释该场景下SCALE_SCH参数的工作机制。

C++ Kernel代码

typedef ap_int<64>  data64_t;
typedef ap_int<128> data128_t;
typedef ap_int<32>  data32_t;

typedef ap_axis<IN_DWIDTH , 0, 0, 0> axis_in;
typedef ap_axis<OUT_DWIDTH , 0, 0, 0> axis_out;

void hls_dma(int                    num_words,
             data64_t              *din,
             data64_t              *dout,
             hls::stream<axis_in>   &strm_in,
             hls::stream<axis_out>  &strm_out)
{
#pragma HLS DATAFLOW

    data64_t temp_in;
    axis_in val_0, val_1;
    data32_t tmp_val;

    rd_loop: for (int i = 0; i < 2 * num_words; i++)
    {
        temp_in = din[i];
        val_0.data = 0x0;
        val_1.data = 0x0;

        tmp_val = temp_in.range(31, 0);
        val_0.data |= tmp_val;
        strm_in.write(val_0);

        tmp_val = temp_in.range(63, 32);
        val_1.data |= tmp_val;
        if(!(val_1.data == 0)) val_1.data = 0;
        strm_in.write(val_1);
    }

    axis_out v0, v1;
    data64_t temp_out;

    wr_loop:
    for (int i = 0; i < 2 * num_words; i++)
    {
        v0 = strm_out.read();
        v1 = strm_out.read();

        temp_out.range(31, 0) = v0.data;
        temp_out.range(63, 32) = v1.data;

        *dout++ = temp_out;
    }
}

extern "C" {
    void fft_infc(int                    fft_select,
                  int                    num_fft,
                  int                    fft_dir,
                  data64_t              *din,
                  data64_t              *dout,
                  volatile ap_uint<24>  *config,
                  hls::stream<axis_in>  &strm_in,
                  hls::stream<axis_out> &strm_out)
    {
        #pragma HLS INTERFACE axis port=config

        #pragma HLS INTERFACE axis_in port=strm_in
        #pragma HLS INTERFACE axis_out port=strm_out

        #pragma HLS INTERFACE m_axi port=din offset=slave bundle=gmem1 
        #pragma HLS INTERFACE m_axi port=dout offset=slave bundle=gmem2 

        ap_uint<24> tmp_config = 0;
        tmp_config[8] = (fft_dir == 1) ? 1 : 0;
        tmp_config.range(4, 0) = fft_select;
        *config = tmp_config;

        hls_dma(SAMPLE_NUM, din, dout, strm_in, strm_out);
    }
}

相关截图

  • 仿真器:emulator
  • FFT配置1:fft configuration 1
  • FFT配置2:fft configuration 2
  • FFT配置3:fft configuration 3
  • 输入数据:输入数据
  • Matlab输出(绝对值):matlab fft abs(output)
  • FFT IP Core输出(绝对值):abs(output)

注:我绘制的是输出结果的绝对值。

内容的提问来源于stack exchange,提问作者A.A.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 00:35:24