Well I don't know if someone already explained about FIR filtering and convolution but I have some things to point out :
1- FIR filtering implies latency. You can't get 0 latency, whatever people says, because filtering is causal and 0 latency would mean able to predict the future (I'm not sure you can predict the future but if you can do it please tell me !). For those that thinks it's okay to use huge filters length (65k for exemple) and using partitioning to reduce latency (which effectively works but reduce your effective filter length) just try this : make a low pass filter of let's 50hz with high slope (48dB/octave for exemple), 2048 coefficients, then apply a simple blackmann-nuttall windowing for exemple. Then make another low pass filter of same fc and same slope but with 8x more coefficients : 8x2048. Then measure the resulting impulse of a loopback measurement applying the 2048taps low pass filter, and compare with the 8x2048=16384taps low pass filter. Now make another measurement with the 16384taps with a convolution by partitioning 8x (which equals in fact to a 2048 taps filter) and compare the response of the resulting impulse. Your 16384 taps partitioned 8x have same/lower behavior then your 2048taps filter without partitioning. You can conclude what you want from that.
2- Now you know it's useless to use huge filters with huge partitioning trick instead of using low length filters unpartitioned, you can reduce a lot your processing needs
3- FFT convolution is equals to time convolution, yes but only for convolution. I mean, if you have two signals a and b in time domain, and denote A and B they corresponding response in frequency domain, then theoritically convolution(a, b) is equal to A*B BUT some conditions :
- convolution(a,b) results in a signal of size R where R = size of a + size of b - 1 (it's convolution definition !), A and B are of size of a and b respectively, so you can't do A*B, then apply an inverse transform to get the signal back.... You have to scale the size of the FFT vectors so that A and B are of size of R before applying ifft(A,B).
The inverse convolution in FFT is much more difficult to handle : in time domain inverse convolution can't be done in a general case (at least for me it's not possible because when you do : a convolve b = c, you makes multiplication with 0 or some really low values, and the only way to get the original signal a from c by doing inverse convolution b is to find how X * 0 = 0 : you can't find the original value of X, because 0 / 0 is undefined....
In frequency domain you can calculate the original signal by doing A/B, but it's difficult because in FFT domain the signal is supposed to be periodic (which is not sometimes), so the resulting solution needs to be trunc and have some time shifts (to do a good inverse I have used this GNU Octave simple code but you have to specify the resulting length you wants and the time alignment is done tracking peak absolute values in time domain of the 2 input signals :
https://www.dropbox.com/s/rnpwplkps763gn1/fftdiv.m?dl=0 with this file also for tracking peak signal value :
https://www.dropbox.com/s/53l16vbdo5fy7hj/max_absolute_peak.m?dl=0).
I have tried to correct my system by doing some simple things, and I obtain a theoritically perfect correction on the paper (tested by time convolution with system impulse measure and correction fitler generated, and with real measurement applying correction filter on my system). The resulting impulse is NOT ok in reality, because the holes in frequency domain are hugely compensated, which results in an endless oscillation in the correction filter at theses frequencies, and in the real measurement the frequency response amplitude AND phase IS ok but not the waterfall/spectrogram, which shows huge resonance at some frequencies, and these effects are clearly audible (it's TOTALLY wrong) : this is because the system is not completely linear, at least is what I concluded (because the holes in frequency amplitudes have corresponding high THD and so when you try to compensate this you increase in fact the distorsion of the system !).
The only way I found to avoid theses problems is to trunc the correction filter in time domain by applying windowing to remove these resonances but doing so the resulting frequency response is not good...
Using DRC always give me audible artefacts in transient responses too.
Correction seems to works better in near field but it's still so wrong.
Last point, when someone asks why their filter needs so much attenuation, the simple explanation is that generally a correction filter implies gains and losses in frequency domain. If your input signal is 0dBFS all the way from 0hz to you FS, then if you want's your resulting signal after convolution avoid clipping you have to limit the level of your filter to 0dBFS for the max peak in frequency domain (increase the length of your filter by applying 0 to increase FFT resolution, for exemple if you have a 2048 taps filter, adds 0 so your resulting filter is let's say 262144 (adding then 260096 zeros to the end or to the beginning, because frequency is cyclic that doesn't matter except for absolute phase values...), then do an FFT of your filter. If your signal have a peak to +15dBFS in frequency domain at 1055hz for exemple, then you have to attenuate your filter when you do some convolution by 15dB to avoid clipping at this frequency... because inputting a 1055hz signal at 0dBFS to your system convolved with your filter would result to an output of +15dBFS and so you would have some clipping !
Thus the more you correct your system, the more you limit your dynamic range.