If you want something simple to implement you can use what I did in the fldigi version of SCAMP:
look at the?
int scamp::rx_process(const double *buf, int len)
method.? It implements a simple circular buffer filter, which has a sinc-like response but its frequency may be moved around dynamically.? I use a different approach in my guitar pedal code:
for example look at the "DSP_TYPE_WAH" filter effect.? This uses a dynamically changed bandpass filter based on the position of a foot pedal, and does some simple interpolation to move the center frequency around by changing the coefficients of a digital biquad filter.?
All digital filters are implemented with a delay, and so none are "noncausal."? There is a compromise between group delay, which is the amount of lag that the filter applies to the signal and the sharpness of the filter.? A "minimum phase" filter minimizes this delay and has the property that the real and imaginary parts are related by the Hilbert transform.? A filter can be expressed as a cascade of a minimum phase filter and an all-pass filter.
Analog?filters?are?minimum?phase?as?are?all?physical?processes.??But?the?digital?design?examples?I?saw?were?zero?phase?with?a?symmetric?impulse?response.??This?leads?to?a?non-physical?result.??The?filter?output?begins?*before*?the?input?arrives.??I?find?that?rather?hard?to?justify?in?a?communication?system.??A?quick?check?of?the?indices?revealed?that?except?for?a?very?brief?mention?of?minimum?phase?and?causality?the?issue?is?completely?ignored.??Oppenheim?and?Schafer?devote?a?few?page?and?Rabiner??and?Gold?a?paragraph?before?dismissing?the?matter.? Another text made no mention of it at all.