0
$\begingroup$

I'm implementing an Eq which uses a uniformly partitioned convoluter in the backend. I'm following wefers pg 106.. .

I'm using overlap save with 50% overlap. I have 8 filter parts with each size of (256 + 1) complex numbers. And I process the data for every 256 samples. I need help with the Filter coefficients, I have 3 bands and I know the linear gain in each band, what should be the (real and imaginary) values in each filter partition. (I think we cannot just set them consecutively based on the frequency because for each input block spectra is spread across the whole frequency till nyquist frequency). Any help is appreciated.

tldr : It would be very cool to know how to set the filter coefficients(for a uniformly partitioned convoluter) in each filter segment based on an arbitrary frequency domain signal.

I know how to generate these filter coefficients from a time domain signal but I do not want to perform an Ifft on this and calculate the coefficients as I will be needing to do this quite often.

$\endgroup$
2
  • $\begingroup$ If all you need is a 3 band equalizer a block convolver is massive overkill. You can start with 3 sections of a parametric EQ from here: webaudio.github.io/Audio-EQ-Cookbook/audio-eq-cookbook.html. You typically use a block convolver if you have a room impulse response with 1000s filter taps. $\endgroup$
    – Hilmar
    Commented Aug 27 at 6:33
  • $\begingroup$ Thanks for the reply @Hilmar but I need this because I need to scale this to high resolution filters with low latency. $\endgroup$ Commented Aug 27 at 7:03

1 Answer 1

0
$\begingroup$

Here is the recipe then:

  1. Define the magnitude of the transfer function at the full impulse response length (2048 samples -> 1025 frequencies)
  2. Add a suitable phase. If latency is a priority, a minimum phase would be the way to go.
  3. Make it conjugate symmetric and do an inverse DFT to get the full-length impulse response.
  4. Chop up the impulse response into 8 blocks of 256 samples each.
  5. Zero pad to 512 samples, perform DFT and throw away the negative frequencies. You end up with 8 sets of frequency domain coefficients with 257 samples each.
$\endgroup$
4
  • $\begingroup$ Thank you for the answer, but we can't somehow realise the coefficients in each part directly from the whole transfer function without the time domain intermediate? $\endgroup$ Commented Aug 27 at 12:58
  • $\begingroup$ Hilmar, you should look at this. When using FFT to do fast convolution, you don't really want to divide it in half where the impulse response is the same length as the buffer size. You want the buffer size to be much longer. $\endgroup$ Commented Aug 27 at 15:14
  • $\begingroup$ @robertbristow-johnson: If latency is a concern you want to keep the buffer size and FFT size reasonably short. That's the nice this of a block convolver, you can trade latency vs efficiency more or less continuously. You can even get to two sample latency if you implement the first block as a direct FIR in parallel to the block convolver. $\endgroup$
    – Hilmar
    Commented Aug 27 at 15:20
  • $\begingroup$ "If latency is a concern you want to keep the buffer size and FFT size reasonably short." - - - - Of course. You know Bill Gardner, don't you? I think he lives in the Mass neighborhood. If latency is a concern you want unequal partition sizes, smaller partitions for earlier parts of the impulse response. But still, you don't want to make your buffer size as small as the impulse response segment length. You want the buffer length much larger. $\endgroup$ Commented Aug 27 at 15:26

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.