我将几个 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));
}
}