平均频谱给出不正确的 RMS

信息处理 fft
2022-02-21 08:21:05

我将几个 FFT 结果平均在一起,试图获得音频轨道的平均频谱。我正在尝试使用 Parseval 的关系从得到的平均频谱中获取音频的 RMS,但我注意到我得到的 RMS 是错误的,通常只有几个 dB。为什么会这样?这是否意味着我错误地将光谱平均在一起?是否比简单地将相应的 N 个幅度相加并除以 N 更复杂?当我使用 Parseval 的关系从单个 FFT 获得 RMS 时,它是正确的。

这是我用来平均 FFT 的代码:

    int N = pow(2, resolution);

    //temporary buffers
    vector< array<double,2> > RXT; 
    vector< array<double,2> > IXT;

    //final signals
    REX.assign(N, array<double,2>() );
    IMX.assign(N, array<double,2>() );
    magnitude.assign( N, array<double,2>() ); 
    phase.assign( N, array<double,2>() );

    int start;
    bool lastSeg = false;
    int seg = 0;
    //double radians = 2 * PI / N; //used for windowing functions

    while ( !lastSeg ) {

        start = seg * N;

        if (X.size() >= start + N) {
            RXT.assign(X.begin()+start,X.begin()+start+N);
        } else {
            RXT.assign(X.begin()+start,X.end());
            for ( int n = 0; n < RXT.size(); n++ ) {
                for ( int chan = 0; chan < channels; chan++ ) {

                    RXT.at(n).at(chan) *= (double)N / RXT.size();

                }
            }
            RXT.resize( N, array<double,2>() );
            lastSeg = true;
        }

        IXT.assign( N, array<double,2>() );

        FFT(RXT, IXT);

        for ( int n = 0; n < N; n++ ) {
            for ( int chan = 0; chan < channels; chan++ ) {

                magnitude.at(n).at(chan) += getMag( RXT.at(n).at(chan), IXT.at(n).at(chan) );

            }
        }

        seg++;

    }

    for ( int n = 0; n < N; n++ ) {
        for ( int chan = 0; chan < channels; chan++ ) {

            magnitude.at(n).at(chan) /= seg;

            REX.at(n).at(chan) = getReal(magnitude.at(n).at(chan), phase.at(n).at(chan));
            IMX.at(n).at(chan) = getImag(magnitude.at(n).at(chan), phase.at(n).at(chan));
        }
    }
0个回答
没有发现任何回复~