如何使用 Juce 为脉冲响应加载音频文件

Posted

技术标签:

【中文标题】如何使用 Juce 为脉冲响应加载音频文件【英文标题】:How to load audio files for impulse responses using Juce 【发布时间】:2015-10-22 11:38:49 【问题描述】:

我目前正在为大学创建一个卷积混响插件,并且我已经下载了一个已经制作的卷积器库以在插件中使用。我有一些代码会产生脉冲响应,但是我不太确定如何将实际的音频文件加载到进程中。

这是卷积器类:

class FFTConvolver
  
public:
  FFTConvolver();  
  virtual ~FFTConvolver();

  /**
  * @brief Initializes the convolver
  * @param blockSize Block size internally used by the convolver (partition size)
  * @param ir The impulse response
  * @param irLen Length of the impulse response
  * @return true: Success - false: Failed
  */
  bool init(size_t blockSize, const Sample* ir, size_t irLen);

  /**
  * @brief Convolves the the given input samples and immediately outputs the result
  * @param input The input samples
  * @param output The convolution result
  * @param len Number of input/output samples
  */
  void process(const Sample* input, Sample* output, size_t len);

  /**
  * @brief Resets the convolver and discards the set impulse response
  */
  void reset();

private:
  size_t _blockSize;
  size_t _segSize;
  size_t _segCount;
  size_t _fftComplexSize;
  std::vector<SplitComplex*> _segments;
  std::vector<SplitComplex*> _segmentsIR;
  SampleBuffer _fftBuffer;
  audiofft::AudioFFT _fft;
  SplitComplex _preMultiplied;
  SplitComplex _conv;
  SampleBuffer _overlap;
  size_t _current;
  SampleBuffer _inputBuffer;
  size_t _inputBufferFill;

  // Prevent uncontrolled usage
  FFTConvolver(const FFTConvolver&);
  FFTConvolver& operator=(const FFTConvolver&);
;

这是我用来实现脉冲响应的代码(但不是音频文件):

//convolver
    ir.ensureStorageAllocated (512);
    zeromem (ir.getRawDataPointer(), 512 * sizeof(float));
    ir.set (0, 1.0f);


    for (int i = 0; i < 10; ++i)
    
        ir.set (Random::getSystemRandom().nextInt (512),
                Random::getSystemRandom().nextFloat() * 2.f - 1.f);
    

    convolver.init (128, ir.getRawDataPointer(), 512);

在进程块中...

convolver.process (inputData, channelData, buffer.getNumSamples());

谁能告诉我如何使用脉冲响应的实际音频文件?

【问题讨论】:

【参考方案1】:

JUCE 可以在这里为您提供帮助,文档中最相关的部分似乎是:

AudioFormatReader AudioFormat::createReaderFor

【讨论】:

我添加了一个尝试读取音频文件的编辑,但我仍然收到错误,我在正确的行吗? @willfo 如果您已经解决了最初的问题(看起来您已经解决了),请将其标记为已接受,恢复您的编辑,并就 JUCE 组件的新问题提出新问题.我很乐意在那里提供帮助!如果每个问题只问一件事,其他用户可以更轻松地搜索他们的问题的答案。【参考方案2】:

最简单的解决方案是读取未压缩的 .WAV 文件。这是一种简单的文件格式,您可以轻松解析它。由于它是未压缩的,您可以使用 int16_t* 访问示例

【讨论】:

您是在暗示每个样本都有 16 位吗?甚至 Wav 也没有那么简单。 你能举个例子说明我如何将 .wav 文件加载到函数中吗? @deviantfan:未压缩单通道 WAV 文件其实就是这么简单。我们有好几千兆字节。 @ willfo:不适合发表评论并且受我的雇主的版权保护,但是编写自己的 .WAV 解析器并不难。***的格式正确。

以上是关于如何使用 Juce 为脉冲响应加载音频文件的主要内容,如果未能解决你的问题,请参考以下文章

在 JUCE 中为音频插件使用 GUI 编辑器

如何使用 juce 的 FileFilter 描述我想要的文件过滤器?

如何将可播放的音频文件添加到 TableListBox 播放列表(JUCE C++)

您将如何测量一个音频样本中的低音量?

从 JUCE 音频 VST 插件控制主机播放

JUCE 无法在音频插件上插入按钮