Skip to main content

Filter Bank DSP

Page 1

1

Digital Signal Processing for Audio Applications

Filter Bank DSP

Rachel Locke School of Computing and Engineering University of West London Giulio Moro 13th May 2020


2

INTRODUCTION

2

SPECIFICATIONS WHAT IS FIXED AND WHAT IS USER SPECIFIED?

3 3

DESIGN METHODOLOGY SCALING THE HIGH, MID AND LOW KNOB VALUES HOW LOW AND HIGH CUTOFF FREQUENCY VALUES INFORM THE FUNCTIONALITY OF THE FILTERS

4 5

FILTER DIAGRAMS, SIGNAL FLOW AND FINITE DIFFERENCE EQUATIONS SIGNAL FLOW DIAGRAMS DIFFERENCE EQUATIONS FILTER DIAGRAMS

7 7 7 8

TONE CONTROL TESTING WHAT HAPPENS IN THE INNER LOOP

8 8

6

LOUDNESS CONTROL WHY THE A-WEIGHTING CURVE? THE A-WEIGHTING FORMULA CODE FOR A-WEIGHTING FORMULA COMPARISON OF ACTUAL AND PLOTTED A-WEIGHTING CURVE A-WEIGHTING CURVE PLOTS

9 9 10 10 11 12

FREQUENCY RESPONSE SYMMETRY

13

INVERSE FAST FOURIER TRANSFORM

14

TRUNCATION AND WINDOWING

14

FILTER COEFFICIENTS TESTING THE FILTER RESPONSE

16 17

RESULTS

17

CONCLUSION

20


3

LIST OF FIGURES [1] Transfer Functions For Low Shelving, Peak/Notch and High Shelving Filters [2] Tone Control Signal Flow [3] Tone Control Signal Flow With Loudness [4] First Order High Shelving/Low Shelving IIR Filter [5] Second Order Peak/Notch IIR Filter [6] A, C and Z-weighting Curves, NTI Audio, "Frequency-Weightings for Sound Level Measurements", Nti-audio.com. [Online]. Available: https://www.nti-audio.com/en/support/know-how/frequency-weightings-for-sound-level-measurements. [Accessed: 06- May- 2020]. [7] Figure 7. A-weighting Curve Formula, IEC 61672-1:2013 Electroacoustics - Sound level meters - Part 1: Specifications. IEC. 2013. [8] Figure 8. Comparison of Plotted A-weighting Curve (left) With Actual A-weighting Curve (right). [9] IEC 61672-1:2013 Electroacoustics - Sound level meters - Part 1: Specifications. IEC. 2013. [10] Designing The Frequency Response [11] Property of conjugate symmetry, [14] MacClellan, J., Schafer, R. and Yoder, M., 1998. DSP First. New Jersey: Prentice-Hall, pp.116-169. [12] Impulse Response Before and After Truncation [13] Impulse Response Before and After Windowing (Hann) [14] A Closer Look at the Effect of a Hanning Window On an Impulse Response [15] Generic Finite Impulse Response (FIR) Filter Transfer Function [16] Original Random Noise Signal and Filtered Random Noise Signal [17] Incorrect Function of the A-weighting Filter [18] Final A-weighting Filter Function [19] Magnitude and Phase Response of toneControl() for ẟ[n] Input


4

INTRODUCTION This report: A. Covers the design, implementation and testing of a stereo three band tone control with switchable loudness control. B. Looks at the execution of this as a MATLAB function ‘toneControl’ with the arguments (input, lowCutoffFrequency, highCutoffFrequency, toneLowValue, toneMidValue, toneHighValue, loudnessValue) C. Where: ● output (stereo, matrix with two columns) is the output signal ● input (stereo, matrix with two columns) is the input signal ● lowCutoffFrequency (scalar) is the highest frequency affected by the "low" tone control, and the lowest frequency affected by the "mid" tone control ● highCutoffFrequency (scalar) is the lowest frequency affected by the "high" tone control, and the highest frequency affected by the "mid" tone control ● toneLowValue, toneMidValue, toneHighValue, loudnessValue (scalars): these are the values of the "knobs" of the tone control. A value of 0 means "knob fully counterclockwise" (max attenuation), a value of 1 means "knob fully clockwise" (max boost), so that the central position (no boost/attenuation) of the knob corresponds to a value of 0.5. ● loudnessValue (scalar): whether the loudness emphasis should be on (1) or off (0) SPECIFICATIONS The main aim of the toneControl() is to allow users to personalise their listening experience in the same way as a traditional three-band tone control would on a HiFi system. Once achieved, a further aim is to include a switchable loudness control that compensates for discrepancies in human hearing.We know that three separate filters are required to replicate a conventional tone control and that these three filters will have an affect on the low, mid and high frequency bands and will need to be connected in such a way that an input signal is passed through these bands sequentially [4]. The loudness control needs to be “switchable” , that is, engaged when a user enters an “on” value and bypassed when a user enters an “off” value. WHAT IS FIXED AND WHAT IS USER SPECIFIED? A. FIXED ELEMENTS OF TONE CONTROL

● The filters types: low shelving, peak/notch and high shelving. Filter types and their coefficients are hardcoded within the function, however, users will be able to define


5

values that inform these coefficients (gain, cutoff frequency and therefore bandwidth and centre frequency) ● The signal flow will be fixed, in that, the sequence of the filters and the path that the input signal takes will be predetermined ● The loudness control (on or off): The loudness control will be fully designed and implemented beforehand. A user can choose whether this is enabled or bypassed but aside from that, they can't modify that function or parameters of the loudness control in any way. ● The gain levels that 0 - 1 correspond to +﹣12dB. The minimum and maximum gain levels are set and therefore users can only specify values within the set range. B. USER SPECIFIED ELEMENTS OF TONE CONTROL

● The bandwidth of the frequency bands: With the ability to choose values for lowCutoffFrequency and highCutoffFrequency, the user can determine the bandwidth of each filter. ● Users can specify gain term dependant on the desired level of boost or attenuation for that frequency band a value between 0 - 1 can be chosen for each potentiometer (low mid and high) this will correspond directly to +﹣12dB (0 = ﹣12dB, 1 = +12dB)[1]. ● The input signal is entirely user specified and no assumptions will be made aside from that it will be two-channel stereo

DESIGN METHODOLOGY


6

Using the MATLAB function filter() as a starting point we can see that it takes feedforward coefficients bn, feedback coefficients an, and input signal x as arguments. In this case, the three filters that define a tone control (low shelving, peak/notch and high shelving) can be connected in series [8], we will look a little more at what this means mathematically further into the development process, but for now this can be achieved with three filter() functions. In series, filter one takes the unfiltered input signal x as its input followed by two and three which take the output of their predecessor as their input. lsOut = filter(zrsLs, psLs, x); pnOut = filter(esPn , esPn, lsOut); hsOut = filter(zrss, plsHs, pnOut);

Knowing this, the filter coefficients bn, an can be obtained from looking at generalized low shelving, peak/notch and high shelving transfer functions and stored as vectors. The transfer functions used here are seen below, converted into minus powers of Z, adapted from ‘Audio Effects’ [4]. −1

𝐻𝑙𝑠(𝑧) =

(𝐺𝑡𝑎𝑛(ω𝑐/2) + 𝐺) + (𝐺𝑡𝑎𝑛(ω𝑐/2) − 𝐺) 𝑧

−1

(𝑡𝑎𝑛(ω𝑐/2) + 𝐺 ) + (𝑡𝑎𝑛(ω𝑐/2) − 𝐺) 𝑧 −1

𝐻𝑝𝑛 (𝑧) =

𝐺 + 𝐺 𝑡𝑎𝑛(𝐵/2) − 2 𝐺𝑐𝑜𝑠ω𝑐 𝑧

−1

𝐺 + 𝑡𝑎𝑛(𝐵/2) − 2 𝐺𝑐𝑜𝑠ω𝑐 𝑧

−2

+ 𝐺 − 𝐺𝑡𝑎𝑛(𝐵/2) 𝑧

−2

+ 𝐺 − 𝑡𝑎𝑛(𝐵/2) 𝑧 −1

𝐻ℎ𝑠(𝑧) =

( 𝐺𝑡𝑎𝑛(ω𝑐/2) + 𝐺) + ( 𝐺𝑡𝑎𝑛(ω𝑐/2) − 𝐺) 𝑧

−1

( 𝐺𝑡𝑎𝑛(ω𝑐/2) + 1) + ( 𝐺𝑡𝑎𝑛(ω𝑐/2) − 1) 𝑧

Figure 1. Transfer Functions For Low Shelving, Peak/Notch and High Shelving Filters The example below details the storing of coefficients for a high shelving filter. sHs = sqrt(HsG); tHs = tan(wcHs/2); zrss = [ (sHs * tHs + HsG), (sHs * tHs - HsG) ]; plsHs = [ (sHs * tHs + 1), (sHs * tHs - 1)];

As seen in [fig x] the coefficients are dependent on variables G, ωc, and B, where G is gain, characterised for each filter by the position of its corresponding tone control potentiometer. ωc is


7

cutoff frequency or centre frequency in the case of a peak/notch filter. B is bandwidth which applies only to our peak/notch filter and its two cutoff frequencies. SCALING THE HIGH, MID AND LOW KNOB VALUES

takes the values, toneLowValue, toneMidValue, toneHighValue. These represent the bass, mid and treble potentiometers of a tone control. The values fall between 0 - 1 with 0 being maximum attenuation, 0.5 being no attenuation or boost and 1 being maximum boost. The values for these arguments inform the gain (G) parameter. To make these values useful in terms of gain they are mapped to +﹣12dB, to replicate the range of a hardware amplifier [1], before converting back to linear gain. toneControl()

At first this step was executed in two lines, later shortened to one for readability and to express understanding of the formula that db2mag() makes use of. See example below for toneLowValue. %translate knob values to gain values % dBScaleLowVal = toneLowValue * 24 - 12; % LsG = db2mag(dBScaleLowVal); LsG = 10^((toneLowValue * 24 - 12)/20);

Another way this could be achieved in one line: LsG = db2mag(toneLowValue * 24 - 12);

The scaled knob values LsG, PnG and HsG replace the gain terms in their equivalent coefficients. HOW LOW AND HIGH CUTOFF FREQUENCY VALUES INFORM THE FUNCTIONALITY OF THE FILTERS

Simply put, lowCutoffFrequency is the frequency at which the low shelving filter ends and the peak/notch filter begins and highCutoffFrequency is the frequency at which the peak/notch filter ends and the high shelving filter begins. These values represent the cutoff frequencies (ωc) for the low and high shelving filters. The peak notch instead uses the centre frequency, which can be calculated as the geometric mean of the lowCutoffFrequency and highCutoffFrequency. Because the bands in a tone control are adjacent, the low cutoff frequency of the peak/notch filter is analogous with the high cutoff


8

frequency of the low shelving filter and the high cutoff frequency of the peak/notch filter is analogous with the low cutoff frequency of the high shelving filter [4]. wcLs = lowCutoffFrequency; wcHs = highCutoffFrequency; wcPn = sqrt(wcLs * wcHs);

The final dependent variable required to calculate the filter coefficients is bandwidth (B) which is simply the difference between the high and low cutoff frequencies. B = highCutoffFrequency - lowCutoffFrequency;

FILTER DIAGRAMS, SIGNAL FLOW AND FINITE DIFFERENCE EQUATIONS

SIGNAL FLOW DIAGRAMS

Figure 2. Tone Control Signal Flow

Figure 3. Tone Control Signal Flow With Loudness


9

The transfer function of filters in series is equivalent to the product of the transfer functions of the filters, HLS(Z) × HPN(Z) × HHS(Z).

DIFFERENCE EQUATIONS

𝑦ℎ𝑠[𝑛], 𝑦𝑙𝑠[𝑛] = 𝑏0𝑥[𝑛] + 𝑏1𝑥[𝑛 − 1] − 𝑎1𝑦[𝑛 − 1] 𝑦𝑝𝑛[𝑛] = 𝑏0𝑥[𝑛] + 𝑏1𝑥[𝑛 − 1] + 𝑏2𝑥[𝑛 − 2] − 𝑎1𝑦[𝑛 − 1] − 𝑎2𝑦[𝑛 − 2] Figure x. Finite difference equations for high shelving, low shelving and peak/notch filters

FILTER DIAGRAMS

Figure 4. First Order High Shelving/Low Shelving IIR Filter

Figure 5. Second Order Peak/Notch IIR Filter


10

TONE CONTROL TESTING The tone control is tested with three for loops in order to assess the response at multiple potentiometer positions. The outer loop iterates through values of 0 - 1 in a step of 0.25 for toneLowValue, of course the step can be adjusted depending on how many points we want to measure and compare the frequency response at. The two nested loops do the same for toneMidValue and toneHighValue. WHAT HAPPENS IN THE INNER LOOP

The code executed in the innermost loop simultaneously plots the magnitude and phase response corresponding to the combined positions of the tone control knobs in series. The purpose of this testing is to examine the frequency response curve and conclude whether this corresponds with what is expected of our filter design [2]. For an impulse signal input we are obtaining the impulse response ℎ[𝑛]and then taking the FFT of the impulse response to get the frequency 𝑗𝑤𝑇

response𝐻[𝑒

|

], taking the absolute value and the angle separately to acquire the magnitude

𝑗𝑤𝑇

|

𝑗𝑤𝑇

response 𝐻[𝑒 ] and phase response∠𝐻[𝑒 ][6]. The values for lowCutoffFrequency [250 Hz] and highCutoffFrequency [4000 Hz] reflect real-world car audio systems [3]. The resultant magnitude and phase plots are saved to individual files, these will be attached as an animated file with the main project. Further results of the main control will be discussed in section [IX].

LOUDNESS CONTROL WHY THE A-WEIGHTING CURVE?

What we are aiming to achieve with a loudness control switch, when it is enabled, is to compensate for the human ear and its tendency toward mid range frequencies, resultantly, perceiving low and high frequencies as quieter, particularly at low listening levels. We require the loudness control to “compensate” for this perceived loss by boosting the gain appropriately at low and high frequencies. One way of achieving this is to design a filter to do this for us, we can use the FIR frequency-response method as we already know that we want our frequency response to resemble an equal loudness curve. An inverted A - weighting curve can successfully approximate this [5].


11

Figure 6. A, C and Z-weighting Curves

The A - weighting curve [ fig 6] is modelled on a 40 phon Fletcher Munson curve [fig 9]

THE A-WEIGHTING FORMULA

Figure 7. A-weighting Curve Formula

CODE FOR A-WEIGHTING FORMULA %A - weighting curve equation fSq = f .* f; H = ((12194 .^ 2) .* f .^ 4) ./ ((fSq + 20.6 .^ 2) .* (fSq + 12194 .^ 2) .* sqrt((fSq + 107.7 .^ 2).*(fSq + 737.9 .^ 2)));

To invert the A-weighting Code formula we simply flip the numerator and the denominator. In both cases it is important that the operations are element wise as f is a vector.


12

%A - weighting curve equation fSq = f .* f; H = ((fSq + 20.6 .^ 2) .* (fSq + 12194 .^ 2) .* sqrt((fSq + 107.7 .^ 2).*(fSq + 737.9 .^ 2))) ./ ((12194 .^ 2) .* f .^ 4)

COMPARISON OF ACTUAL AND PLOTTED A-WEIGHTING CURVE

Figure 8. Comparison of Plotted A-weighting Curve (left) With Actual A-weighting Curve (right). Above in [fig. 8] the original A-weighting curve is compared with another generated via an A-weighting formula [fig. 7] and plotted in MATLAB. The gain is compared for frequencies 100Hz, 1kHz and 10kHz for completeness.


13

Figure 9. Inverse A-weighting curve approximating a 40 phon equal loudness contour (left), equal loudness contours ISO 226:2003 revision (right) In [fig. 9] ISO standard equal loudness contours [7] are compared with an approximation of the 40 phon equal loudness contour generated via an inverted A-weighting formula [fig. 7]. Again the gain is compared for frequencies 100Hz, 1kHz and 10kHz. In this case, although the values are a close approximation they are not exact due to the peaks in the original 40 phon equal loudness contour between 1kHz - 2kHz and 8kHz - 11kHz, these peaks represent frequency bands where humans require slightly boosted gain to hear them as “equal”. Note that our approximation (left) instead considers the more extreme highs and lows of the frequency spectrum. A-WEIGHTING CURVE PLOTS


14

Figure 10. Designing The Frequency Response

FREQUENCY RESPONSE SYMMETRY Once the desired frequency response is achieved it must be made almost-symmetric [fig 10], with the exception of the Nyquist Frequency and DC (0Hz). The rationale behind this integral step in FIR filter design is that the purely real-valued impulse response we require must have Hermitian symmetry in the frequency response about Nyquist or 𝜋, this is the conjugate symmetry property of FIR frequency responses [13].

𝐻 (− ω) =

*

𝐻 (ω)

Figure 11. Property of conjugate symmetry In MATLAB this involves extending the desired frequency response with a reversed version of itself, the revered, portion of the signal is take from the second sample i.e H = [H; flipud(H(2:end))]

In this case the function flipud() is used as we are dealing with extending a column vector.


15

INVERSE FAST FOURIER TRANSFORM Just as taking the Fast Fourier Transform [FFT] of a filter’s impulse response h[n] will give the frequency response of the filter, the reverse operation, starting from a chosen frequency response and taking the Inverse Fast Fourier Transform [IFFT] (after ensuring conjugate symmetry) will return a real valued impulse response [14]. The code below can be used to test that this process has been successful by retaking the FFT of the impulse response ‘h’ and plotting the result in the frequency domain. plot(20*log10(abs(fft(h))))

TRUNCATION AND WINDOWING

Figure 12. Impulse Response Before and After Truncation

“Ideal” impulse responses are infinitely long and therefore cannot be easily used in practice to perform a filtering operation. The simplest way of time-limiting the impulse response is to take


16

an interval of the original signal from -M:M [9]. It is important that the main energy of the impulse response is preserved within the truncated region [10]. The truncation performed above has the same effect as windowing with a rectangular window, however, on its own it is a relatively poor window choice for audio filters [11] due to the abrupt edges. Both the Hann and Hamming windows were tested on the impulse response, with the Hann window proving to be the most suitable as it takes the edges of the truncated impulse response down to zero exactly. Tapering to zero helps to preserve the shape of an ideal frequency response [fig 14].

Figure 13. Impulse Response Before and After Windowing (Hann)


17

Figure 14. A Closer Look at the Effect of a Hanning Window On an Impulse Response

FILTER COEFFICIENTS In this case, because we are designing a finite impulse response (FIR) filter the values of the windowed impulse response are the feed-forward coefficients (bn) of the filter. The denominator of a non-recursive filter’s transfer function will always be 1 (fig 15). −1

𝐻(𝑍) =

−2

−𝑁

𝑏0 + 𝑏1𝑧 + 𝑏2𝑧 ... + 𝑏𝑁𝑧 1

Figure 15. Generic Finite Impulse Response (FIR) Filter Transfer Function


18

TESTING THE FILTER RESPONSE

Figure 16. Original Random Noise Signal and Filtered Random Noise Signal x = randn(10000, 1) * 2 - 1; %create a random signal to test the filter xf = filter(bn, 1, x); %filter the signal

F = (0:length(x)-1)/length(x)*Fs;%create a frequency axis figure(4) semilogx(F, 20*log10(abs(fft([x xf])))) %plots frequency axis F against, the FFT of the original signal and the filtered signal grid on title('Original Signal and Filtered Signal') legend('Unfiltered', 'Filtered') ylabel('Gain(dB)') xlabel('Frequency(Hz)') xlim([20 20000])

RESULTS In this section we will detail various changes to methodology over the course of the project and examine the magnitude response of tone control() for various gain inputs when loudness is and isn’t enabled. Firstly, it is important to mention that for a portion of the development process the a-weighting filter was working incorrectly. This was due to convoluted calculation methods for the inverse a-weighting curve that gave way to errors, most notably the gain function of the a-weighting filter. Although the filter was filtering the signal for the correct, inverse a-weighting curvature at


19

the correct frequencies, the midrange frequencies were being attenuated whilst the lows and highs remained at the same level as the input signal [fig 17].

Figure 17. Incorrect Function of the A-weighting Filter This was rectified towards the end of the project when the method for the a-weighting inversion was changed to simply, flipping the denominator and the and the numerator of the a-weighting formula. This was a real revelation as it allowed for not only the expected results but also a simplification of the a-weighting FIR code (See below).

Original Code To Generate An Inverse A-weighting Curve

H = ((12194 .^ 2) .* f .^ 4) ./ ((fSq + 20.6 .^ 2) .* (fSq + 12194 .^ 2) .* sqrt((fSq + 107.7 .^ 2).*(fSq + 737.9 .^ 2))); %A - weighting curve equation H(1) = 0; %Inverse A - weighting curve H = 20 * log10(H);%convert y axis to dB before inverting invA = (H .* -1); %invert %reversed, inverted A - weighting curve H = (db2mag(H) .* - 1) + 1; %convert back to linear from dB

Revised Code To Generate An Inverse A-weighting Curve


20

H = ((fSq + 20.6 .^ 2) .* (fSq + 12194 .^ 2) .* sqrt((fSq + 107.7 .^ 2).*(fSq + 737.9 .^ 2))) ./ ((12194 .^ 2) .* f .^ 4); H(1) = 0;

Figure 18. Final A-weighting Filter Function Although this now serves the “correct” purpose visually, we can see from the amplitude axis that we now have the opposite problem and the gain is being boosted too much (almost 35dB) in the high end which is much too loud at this level [fig 9]. In the conclusion we will look at how this could be rectified. From our results we can see that toneControl() is working as it should, (when loudness = 0), we are seeing magnitude response results that are in keeping with what would be expected for different knob positions corresponding to gain boost and attenuation. Some examples below.


21

Figure 19. Magnitude and Phase Response of toneControl() for ẟ[n] input

CONCLUSION The first thing to note is that the loudness control (although it works properly) is unusable at its current state because of how extreme the gain boost is in the low and high end. One way of rectifying this would be with root-mean-squared (RMS) amplitude normalisation. RMS amplitude is the square root of the mean of a signal [15]. Looking back on the results of the A-weighting filter throughout the project and knowing what we know now, it does seem like the original, discarded result [fig 17] is closer to what a RMS normalised relationship would look like between an input and an output signal. One shortcoming of this project is a lack of listening tests. That is, testing the tone control and loudness control with two-channel audio signals and listening to the ways in which they are being affected. Had more of these been performed throughout the development process perhaps


22

the loudness control gain issue could have been spotted and fixed earlier. The clipping and distortion that is prominent when listening is not immediately obvious in the plots.

REFERENCES [1] Electronics, D., 2019. Microtubes 900V2. [online] Darkglass.com. Available at: <https://www.darkglass.com/microtubes-900v2/> [Accessed 1 May 2020]. [2] Krishna, D., 2018. Audio Filters - Designing An Audio Equalizer-7/8. [online] Engineers Garage. Available at: https://www.engineersgarage.com/contributions/audio-filters-designing-an-audio-equalizer-7-8 [Accessed 1 April 2020]. [3] Carrillo III, M., 2018. Car Audio Systems: Terms To Know, How To Listen And What To Listen For. [online] Roadshow. Available at: <https://www.cnet.com/roadshow/news/car-audio-systems-listening-guide/> [Accessed 19 April 2020]. [4] Reiss, J. and McPherson, A., 2015. Audio Effects. Boca Raton, Fla.: CRC Press, pp.89-93. [5] Harrison, M., 2004. Vehicle Refinement. Warrendale, PA: Society of Automotive Engineers, pp.17-73. [6] Smith, J., 2008. Introduction To Digital Filters. Stanford, California 94305 USA: Center For Computer Research In Music And Acoustics (CCRMA), P.Chapter 7. Frequency Response Analysis.. 1st ed. [ebook] California 94305 USA: Center for Computer Research in Music and Acoustics (CCRMA), p.Chapter 7. Frequency Response Analysis. Available at: <http://www.dsprelated.com> [Accessed 10 April 2020]. [7] IEC 61672-1:2013 Electroacoustics - Sound level meters - Part 1: Specifications. IEC. 2013. [8] Tarr, E., 2019. Hack Audio. New York: Routledge, p.247. [9] E. Lai, Practical Digital Signal Processing for Engineers and Technicians. Oxford: Elsevier, 2003, p. 109. [10] Smith, J., Spectral audio signal processing. Stanford, California: Center for Computer Research in Music and Acoustics (CCRMA), 2011, p. Generalized Window Method. [11] Smith, J., Spectral audio signal processing. Stanford, California: Center for Computer Research in Music and Acoustics (CCRMA), 2011, p. Window Method For FIR Filter Design. [12] Smith, J., Spectral audio signal processing. Stanford, California: Center for Computer Research in Music and Acoustics (CCRMA), 2011, p. Windowing a Desired Impulse Response.


23

[13] Punskaya, E., n.d. Design Of FIR Filters. University of Cambridge. pp. 111. [14] MacClellan, J., Schafer, R. and Yoder, M., 1998. DSP First. New Jersey: Prentice-Hall, pp.116-169. [15] Tarr, E., 2019. Hack Audio. New York: Routledge, p.76-78.


Turn static files into dynamic content formats.

Create a flipbook
Filter Bank DSP by RachelLockeDigital - Issuu