【问题标题】:C++ FMOD Studio can't give values to FMOD_DSP_PARAMETER_FFT for freq. analisysC++ FMOD Studio 无法为 FMOD_DSP_PARAMETER_FFT 提供频率值。分析
【发布时间】:2015-05-16 22:30:14
【问题描述】:

我试图在 3D 平面中表示声音的频谱,但我只能播放声音,无法将 dsp 放入 FMOD_DSP_PARAMETER_FFT 结构中,numchannels 和 length 始终 = 0

我的代码是这样的:

FMOD::System     *system;
FMOD::Sound      *sound1;
FMOD::Channel    *channel = 0;
FMOD::ChannelGroup *mastergroup;
FMOD::DSP         *mydsp, *dsphead, *dspchannelmixer;
FMOD::DSPConnection *conection;
FMOD_RESULT       result;
unsigned int      version;
result = FMOD::System_Create(&system);
result = system->getVersion(&version);

result = system->init(32, FMOD_INIT_NORMAL, NULL);


result = system->createSound("mysong.mp3",FMOD_DEFAULT, 0, &sound1);
result = sound1->setMode(FMOD_LOOP_NORMAL);
result = system->playSound(sound1, 0, true, &channel);

/*
Create the DSP effect.
*/

result = system->createDSPByType(FMOD_DSP_TYPE_FFT, &mydsp);
result = mydsp->setParameterFloat(FMOD_DSP_FFT_SPECTRUMDATA, 300.0f);

result = system->getMasterChannelGroup(&mastergroup);
result = mastergroup->getDSP(FMOD_CHANNELCONTROL_DSP_HEAD, &dsphead);
result = dsphead->getInput(0, &dspchannelmixer, 0);

result = dsphead->disconnectFrom(dspchannelmixer);
result = dsphead->addInput(mydsp, &conection);
result = mydsp->addInput(dspchannelmixer);

result = mydsp->setBypass(true);
result = mydsp->setActive(true);

char s[256];
unsigned int len;
float freq[32];

float fft = 0;
std::vector<float> fftheights;

//program loop
while (1) {


  unsigned int ms = 0;
  unsigned int lenms = 0;
  bool         playing = 0;
  bool         paused = 0;
  int          channelsplaying = 0;

  if (channel)
  {
    FMOD::Sound *currentsound = 0;
    result = channel->setPaused(false);
    result = channel->setMute(false);
    result = channel->isPlaying(&playing);
    result = channel->getPaused(&paused);
    result = channel->setVolume(0.5);
    result = channel->getPosition(&ms, FMOD_TIMEUNIT_MS);
    channel->getCurrentSound(&currentsound);
    if (currentsound)
    {
      result = currentsound->getLength(&lenms, FMOD_TIMEUNIT_MS);
    }
  }
  system->getChannelsPlaying(&channelsplaying);
  render_function();
  FMOD_DSP_PARAMETER_FFT *fftparameter;
  result = mydsp->getParameterData(FMOD_DSP_FFT_SPECTRUMDATA, (void **)&fftparameter, 0, 0, 0);
  result = mydsp->getOutput(FMOD_DSP_FFT_SPECTRUMDATA, &mydsp, 0);

  for (int channelfft = 0; channelfft < fftparameter->numchannels; channelfft++)
  {
    for (int bin = 0; bin < fftparameter->length; bin++)
    {
      float val = fftparameter->spectrum[channelfft][bin];
      if (channelfft == 0){
        fftheights.push_back(val);
      }
      else{
        fftheights[bin] += val;
      }

    }
  }
    result = system->update();
}

由于此错误,我无法将值推回 fftheights 向量并且始终为空 0,如果您能帮助我,我会同意。

谢谢。

【问题讨论】:

  • 我的代码已经改变了很多,但如果你能帮助我,我会同意,因为我的改变并没有解决问题......
  • 最后的问题是我绕过了dps,没有它代码运行良好

标签: c++ signal-processing fft fmod low-level-api


【解决方案1】:

我认为您需要使用以下方法设置这些值:

    mydsp->setParameterInt( ... ); // <-- put stuff there

另外,通过查看“结果”来检查函数是否返回任何错误

查看Here 了解更多信息。

【讨论】:

  • 我试过这个:mydsp->setParameterInt(FMOD_DSP_FFT_WINDOWSIZE, FFT_NUM_BINS); mydsp->setParameterInt(FMOD_DSP_FFT_WINDOWTYPE, FMOD_DSP_FFT_WINDOW_HAMMING);现在我收到数字,但值非常低(*10e-34)并且永远不会改变:(
  • Roddey,你说“把员工放在这里”是什么意思?可以举个例子吗?
  • 这就是我说“把东西放在这里”的意思。只需将参数添加到函数中。您打算用于 FFT 的窗口大小是多少?尝试输入确切的数字,并检查所有“结果”变量。您可能想前往信号处理交易所。他们可能比我更熟悉 fmod。
  • 好的,谢谢 Roddey,我会写在信号处理交流中
猜你喜欢
  • 2023-03-12
  • 2010-12-20
  • 1970-01-01
  • 2015-07-16
  • 1970-01-01
  • 1970-01-01
  • 2019-06-21
  • 1970-01-01
  • 2023-04-02
相关资源
最近更新 更多