Python matplotlib-光谱图(v1.3.1)

Python matplotlib-光谱图(v1.3.1),python,audio,matplotlib,Python,Audio,Matplotlib,我想知道matplotlib是如何处理光谱图的。我了解大多数部分,特别是FFT和其他部分,但是,对我来说,缩放似乎不正确。默认值是返回信号的PSD,但是,我似乎无法复制它。例如,在matplotlib中,我得到以下结果: 但是,当尝试复制此内容(在C++中)时,我得到以下结果: 在C++中用MatMattLB绘制,得到了如下结果: 我主要感兴趣的是它们如何“去除”噪音因子,以显示其中功率最大的垃圾箱。我在C++中推的图,我得到了类似的结果,但是它们是不同的。 任何帮助都将不胜感激 std::

我想知道matplotlib是如何处理光谱图的。我了解大多数部分,特别是FFT和其他部分,但是,对我来说,缩放似乎不正确。默认值是返回信号的
PSD
,但是,我似乎无法复制它。例如,在matplotlib中,我得到以下结果:

但是,当尝试复制此内容(在C++中)时,我得到以下结果:

在C++中用MatMattLB绘制,得到了如下结果:

我主要感兴趣的是它们如何“去除”噪音因子,以显示其中功率最大的垃圾箱。我在C++中推的图,我得到了类似的结果,但是它们是不同的。 任何帮助都将不胜感激

std::vector<std::vector<Complex::complex> > ComputeSTFT(std::vector<double> 
&vals, std::size_t NFFT, std::size_t overlap)
{
   std::vector<std::vector<double> > temp_vars = frame(vals, NFFT, overlap);
   std::vector<std::vector<Complex::complex> > STFT(temp_vars.size());
   std::vector<double> hanning = getHanningWindow(256);

   for(unsigned i=0; (i < temp_vars.size()); i++)
   {
      for(unsigned j=0; (j < temp_vars[i].size()); j++)
      {
         double calculation = temp_vars[i][j] * hanning[j];
         calculation = (calculation == -0) ? 0 : calculation;
         temp_vars[i][j] = calculation;
      }
   }

std::vector<std::vector<Complex::complex> > fft_vars(temp_vars.size());
for(unsigned i=0; (i < temp_vars.size()); i++)
{
   fft_vars.resize(temp_vars[i].size());

   FFT f(temp_vars[i].begin(), temp_vars[i].end(), temp_vars[i].size());
   std::vector<Complex::complex> temp_fft = f.transformed();
   fft_vars[i] = temp_fft;
}

for(unsigned i=0; (i < temp_vars.size()); i++)
{
   STFT[i].resize(temp_vars[i].size()/2+1);
   for(unsigned j=0; (j < temp_vars[i].size()/2 + 1); j++)
   {   
       STFT[i][j].re = fft_vars[i][j].re;
       STFT[i][j].im = fft_vars[i][j].im;
    }
}

return STFT;
}



std::vector<double> CalculatePSD(std::vector<Complex::complex> &vals)
{
  std::vector<double> result(vals.size());

  for(unsigned i=0; (i < vals.size()); i++)
  {
    double mag = vals[i].re * vals[i].re + vals[i].im * vals[i].im;
    result[i] = mag;
  }
  std::vector<double> hanning = getHanningWindow(128);
  double sum = 0.0;

  for(unsigned i=0; (i < vals.size()); i++)
  {
     sum += abs(hanning[i]);
  }



for(unsigned i=0; (i < vals.size()); i++)
{
    result[i] = result[i] * 2/(12000)*sum;
    //result[i] /= sum;
    //result[i] *= 1;
}

return result;
}
std::vector ComputeSTFT(std::vector
&VAL,标准::大小\u t NFFT,标准::大小\u t重叠)
{
标准::向量温度=帧(VAL、NFFT、重叠);
std::vector STFT(temp_vars.size());
std::vector hanning=GetHanning窗口(256);
对于(无符号i=0;(i C++代码中有没有<代码> NoVLAPU/<代码>和窗口< /代码>?@ Hyy-是128,与MatMattLIB MHM中的内容重合,认为这是可能的吗?同样乘以汉明窗口(256),然后请检查
pylab.specgram
的python代码:这也得到了一个重大的改进。@HYRY这就是我一直在做的。。。请看这里