Are there any good published approach for designing parametric EQs as FIR filters. The standard techniques discussed in DSP textbooks are frequency-domain-sampling or using Parks-McClellan, which this involves passband, stopband, transition band, etc. This is nice for rejecting a certain portion of the frequency spectrum, or mimicking and existing analog/digital filter. However what if I want to design a filter directly as an FIR filter, for example a peaking/notching/shelving/low-pass/high-pass filter which takes frequency, gain, and bandwidth parameters? Is there a standard technique for designing parametric EQs directly as FIR filters?
These filter types are well covered here http://www.musicdsp.org/files/Audio-EQ-Cookbook.txt
However these are all single biquad IIR implementations. To turn this into an FIR, you could simply calculate the impulse response of these filters and window to a finite size with the desired amount of accuracy. Another option is to design the filter as IIR, sample the frequency response and then do any of the many FIR fitting techniques.
In general you will find that FIR filters are not well suited for this and the number of taps required will heavily depend on the relationship between the corner frequency and the sample rate and also on the Q of the filter.
Well to answer my own question, I have found one reference to designing FIR filters on the wonderful page from Julius Smith: https://ccrma.stanford.edu/~jos/filters/Two_Zero.html. (It was naive of me to not check there first). It's not exactly what I was going for, but much closer to a parametric design then using IR or freq-domain sampling of IIR filters.
I would just partition the frequency domain into something like 4 areas and create 4 low order filters so there's some nice smooth overlap between them. That would require you to create 1 lowpass, 1 highpass, and two bandpasss filters where you scale the gain of each filter independently. Run the data through each filter and sum the results. Here's some MATLAB code to illustrate what I'm talking about run on some random data.
x = randn(1,65536); b1 = fir2(12, [0 0.25 0.5 1], [1 1 0 0]); b2 = fir2(12, [0 0.24 0.51 1], [0 1 1 0]); b3 = fir2(12, [0 0.49 0.75 1], [0 1 1 0]); b4 = fir2(12, [0 0.5 0.75 1], [0 0 1 1]); g1 = 1.0; g2 = 0.5; g3 = 0.2; g4 = 0.2; y = g1*filter(b1, 1, x) + g2*filter(b2, 1, x) + ... g3*filter(b3, 1, x) + g4*filter(b4, 1, x); plot(20*log10(abs(fft(y))))
Matlab's documentation for filter design should have the references you are looking for.
fir2 might do it.