- Are there any All-Pass filter plugins(AU, VST, AAX)?
The standard EQ plugin of Reaper (ReaEQ, you can also get this as a separate VST plugin) has different modes for the filters (a parametric EQ is nothing but a cascade of tweakable filters), including allpass.
- What does changes the phase relationship among various frequencies mean and what is its musical application?
One way to look at it is that an all-pass filter is a short frequency-dependent delay. (In fact, an ordinary delay might also be considered an all-pass filter, though that's not usually what's meant by it.) See this example of a sweeping 1st-order all-pass applied to two different sinusoidals:
For very high filter frequencies, both signals are only delayed by the same small time, whereas for very low frequencies the delay approaches ½ or the signal period. (These exact details may vary between different kinds of APFs, but the principle is always similar.)
- What does changes the phase relationship among various frequencies mean and what is its musical application?
As the other answer said, it is mostly relevant when you combine multiple signals that have a fixed phase relation – like one instrument recorded with two microphones. It may be that the microphones give in-phase signals below 300 Hz but out-of-phase for higher frequencies. In this case, neither direct mix nor phase-inverting one of the mics may give a good result, but an all-pass filter (and/or a short delay) on one of the channels might help.
Unlike a delay, an all-pass filter does also have an effect when applied to a single signal in isolation, though this is not evident on sinusoidals and almost inaudible because the ears are most sensitive to the Fourier amplitudes (i.e. sinusoidal components). However, in practice most signals are of course not sinusoidal. As the filters are linear, the result for a superposition is the same as a superposition of individually-filtered sinusoidals, however because those are delayed by different amounts, the resultant waveshape does actually change. In the example of those two sinusoidals, like this:
Again, the ear isn't very sensitive to phase, but the effect is quite significant in particular for signals with strong transients, such as this:
Notice how, although the APF does by definition not affect the power of the signal, it does in this case reduce the amplitude considerably, because the transient is smeared out a bit. This can be useful e.g. for drum tracks, to maximise loudness within a given headroom without needing compressor/limiter/softclipping.
Source code (Haskell with dynamic-plot):
import Graphics.Dynamic.Plot.R2
import Data.List
import Data.Function
import Text.Printf
type Signal = [Double]
lpf :: Double -> Signal -> Signal
lpf f = go 0
where go s (y:ys) = s' : go s' ys
where s' = s*(1-η) + y*η
go _ [] = []
η = 2*pi * f / sRate
allpass :: Double -> Signal -> Signal
allpass f ys = zipWith (\lfd orig -> 2*lfd - orig)
(lpf f ys) ys
signalPlot :: Signal -> DynamicPlottable
signalPlot ys = lineSegPlot $ zip [0, 1/sRate..] ys
functionSignal :: Double -> (Double -> Double) -> Signal
functionSignal l f = f <$> [0, 1/sRate .. l]
sRate :: Double
sRate = 44100
examples :: [ [DynamicPlottable] ]
examples = [ example ++ [forceXRange (0.01, 0.02), xAxisLabel "𝑡"]
| example <- plots ]
where plots
= [ let [sig0, sig1] = functionSignal 0.02
<$> [(+1) . sin . (2*pi*440*), (+(-1)) . sin . (2*pi*675*)]
in [ signalPlot sig0 & legendName "440 Hz"
, signalPlot sig1 & legendName "675 Hz"
, animatedAllpassPlot $ \apf -> plot $ signalPlot . apf
<$> [sig0, sig1]
]
, let sig = functionSignal 0.02
$ \t -> sin (2*pi*440*t) + sin (2*pi*675*t)
in [ signalPlot sig & legendName "440 Hz & 675 Hz"
, animatedAllpassPlot $ \apf -> signalPlot $ apf sig
]
, let sig = functionSignal 0.02
$ \t -> let φ = 2*pi*300*t in (sin φ/1.4 + 0.3)^9 - cos φ/3
in [ signalPlot sig & legendName "Orig"
, animatedAllpassPlot $ \apf -> signalPlot $ apf sig
]
]
animatedAllpassPlot ftrUsr
= plotLatest [ ftrUsr (allpass f)
& legendName (printf "APF @%.0g Hz" f)
| f <- (+50) . (*800) . (+1) . sin <$> [0,0.1..]
]
main :: IO ()
main = mapM_ plotWindow examples