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

C++实现LFM波形模糊函数计算结果异常求助

LFM波形模糊函数计算问题

我正在计算LFM波形的模糊函数(Ambiguity Function),以下是我的实现代码:

std::vector<std::vector<double>> Waveform::AmbiguityFunction(std::vector<std::complex<double>>& signal) {
    int size = signal.size() ; 
    // Compute FFT of the original signal

    std::vector<std::complex<double>> fftResultOriginal = FFT(signal);

    // Initialize the ambiguity matrix
    std::vector<std::vector<double>> ambiguity(size, std::vector<double>(size, 0.0));

    for (int m = 0; m < size; ++m) { // iterate through all delays m
        // Generate delayed signal
        std::vector<std::complex<double>> delayedSignal(size, 0.0);
        for (int k = 0; k < size; ++k) {
            delayedSignal[k] = signal[k] * std::polar(1.0, -2.0 * M_PI * m * k / size);

        }

        // Compute FFT of the delayed signal
        std::vector<std::complex<double>> fftResultDelayed = FFT(delayedSignal);

        // Element-wise multiplication
        std::vector<std::complex<double>> product(size);
        for (int i = 0; i < size; ++i) {
            product[i] = fftResultOriginal[i] * std::conj(fftResultDelayed[i]);
        }

        // Inverse FFT
        std::vector<std::complex<double>> ifftResult = IFFT(product);

        // Retrieve the real part and compute magnitude
        for (int n = 0; n < size; ++n) {
            ambiguity[m][n] = std::norm(ifftResult[n]);
        }
    }

    return ambiguity;
} 

预期输出应为典型LFM波形的模糊函数形态(斜脊状),但实际输出呈现平铺的非预期形态。已通过Python绘图验证,排除了绘图问题,怀疑延迟环节存在错误,尝试修改延迟代码后仍未解决。

以下是FFT和IFFT的实现代码:

// ---------------------------------------- IFFT METHOD --------------------------------------------------------------
std::vector<std::complex<double>> Waveform::IFFT(std::vector<std::complex<double>>& fftResultVector) {
    // Ensure input vector is not empty
    if (fftResultVector.empty()) {
        return {};
    }

    // Perform IFFT using Eigen
    Eigen::FFT<double> fft;

    // Convert input vector to Eigen type using Eigen::Map
    Eigen::VectorXcd inputEigen = Eigen::Map<Eigen::VectorXcd>(fftResultVector.data(), fftResultVector.size());

    // Perform IFFT
    Eigen::VectorXcd ifftResultEigen = fft.inv(inputEigen);

    // Convert Eigen result back to std::vector
    std::vector<std::complex<double>> ifftVec(ifftResultEigen.data(), ifftResultEigen.data() + ifftResultEigen.size());

    return ifftVec;
}

// ---------------------------------------- FFT METHOD --------------------------------------------------------------
std::vector<std::complex<double>> Waveform::FFT(std::vector<std::complex<double>>& WfmVector) {
    // Ensure input vector is not empty
    if (WfmVector.empty()) {
        return {};
    }

    // Perform FFT using Eigen
    Eigen::FFT<double> fft;

    // Convert input vector to Eigen type
    Eigen::VectorXcd inputEigen(WfmVector.size());
    for (int i = 0; i < WfmVector.size(); ++i) {
        inputEigen(i) = WfmVector[i];
    }

    // Perform FFT
    Eigen::VectorXcd fftResultEigen = fft.fwd(inputEigen);

    // Convert Eigen result back to std::vector
    std::vector<std::complex<double>> fftVec(fftResultEigen.data(), fftResultEigen.data() + fftResultEigen.size());

    return fftVec;
}

我已尝试修改延迟代码并在其他语言中绘图,但问题仍未解决。

内容的提问来源于stack exchange,提问作者João Santos

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 09:35:39