NewsWorksSoftwareTextBioContact
background image

Using Linkwitz-Riley filters for ambisonics shelving?

February 6, 2007

In ambisonics shelf filters are used to enable separate decoding for low frequencies (below 500 Hz) and high frequencies as auditory localization depends on interaural time differences for the former and interaural intensity differences for the latter.

Shelf filters are generally implemented as finite impulse response filters using convolution. I am pondering the possibilities of using 4th-order Linkwitz-Riley filters for shelfing. Linkwitz-Riley filters when added up again reproduce correct intensity at all frequencies and the low and high components are phase-aligned at all frequencies. These are the properties that make them suitable for crossover in digital circuits for loudspeaker designs. Maybe it would also work well fro shelf filters?

Below are screen captures from a Max patch made to double-check the frequency response of filtered and combined signal. tl.crossover4~ is part of tl.objects.

2007_02_06_white

Spectrum of filtered and raw signal with white noise as source. Click on image for closer view.

 

 

2007_02_06_pink

Spectrum of filtered and raw signal with pink noise as source. Click on image for closer view.

 

 

The Max patch is below.

#P window setfont “Sans Serif” 12.000
#P window linecount 1
#P comment 416 520 32 196620 raw
#P comment 133 520 55 196620 filtered
#P comment 31 494 320 196620 Log Frequency Scale , Log Amplitude Scale
#P window setfont “Sans Serif” 9.000
#P newex 336 520 71 196617 receive~ raw
#P user spectroscope~ 535 555 66 200 20 1 0 0 1 1 0 1 0 0 0 0
#X frgb 224 224 224
#X brgb 255 255 255
#X rgb2 0 0 0
#X rgb3 243 204 204
#X rgb4 255 0 0
#X rgb5 184 184 184
#X rgb6 0 0 0
#X rgb7 0 0 0
#X rgb8 255 255 255
#X rgb9 255 0 0
#X rgb10 255 191 0
#X rgb11 0 191 127
#X rgb12 127 0 127
#X rgb13 0 0 0
#X range 0.000 1.200
#X domain 0.000 22050.000
#X done
#P user spectroscope~ 336 555 200 200 20 0 1 3 0 1 0 1 0 0 0 0
#X frgb 224 224 224
#X brgb 255 255 255
#X rgb2 0 0 0
#X rgb3 243 204 204
#X rgb4 255 0 0
#X rgb5 184 184 184
#X rgb6 0 0 0
#X rgb7 0 0 0
#X rgb8 255 255 255
#X rgb9 255 0 0
#X rgb10 255 191 0
#X rgb11 0 191 127
#X rgb12 127 0 127
#X rgb13 0 0 0
#X range 0.000 1.200
#X domain 0.000 22050.000
#X done
#P newex 31 520 87 196617 receive~ filtered
#P user spectroscope~ 230 555 66 200 20 1 0 0 1 1 0 1 0 0 0 0
#X frgb 224 224 224
#X brgb 255 255 255
#X rgb2 0 0 0
#X rgb3 243 204 204
#X rgb4 255 0 0
#X rgb5 184 184 184
#X rgb6 0 0 0
#X rgb7 0 0 0
#X rgb8 255 255 255
#X rgb9 255 0 0
#X rgb10 255 191 0
#X rgb11 0 191 127
#X rgb12 127 0 127
#X rgb13 0 0 0
#X range 0.000 1.200
#X domain 0.000 22050.000
#X done
#P user spectroscope~ 31 555 200 200 20 0 1 3 0 1 0 1 0 0 0 0
#X frgb 224 224 224
#X brgb 255 255 255
#X rgb2 0 0 0
#X rgb3 243 204 204
#X rgb4 255 0 0
#X rgb5 184 184 184
#X rgb6 0 0 0
#X rgb7 0 0 0
#X rgb8 255 255 255
#X rgb9 255 0 0
#X rgb10 255 191 0
#X rgb11 0 191 127
#X rgb12 127 0 127
#X rgb13 0 0 0
#X range 0.000 1.200
#X domain 0.000 22050.000
#X done
#P window setfont “Sans Serif” 12.000
#P comment 416 231 32 196620 raw
#P comment 133 231 55 196620 filtered
#P comment 31 205 320 196620 Linear Frequency Scale , Log Amplitude Scale
#P window setfont “Sans Serif” 9.000
#P newex 336 231 71 196617 receive~ raw
#P user spectroscope~ 535 266 66 200 20 1 0 0 1 1 0 0 0 0 0 0
#X frgb 224 224 224
#X brgb 255 255 255
#X rgb2 0 0 0
#X rgb3 243 204 204
#X rgb4 255 0 0
#X rgb5 184 184 184
#X rgb6 0 0 0
#X rgb7 0 0 0
#X rgb8 255 255 255
#X rgb9 255 0 0
#X rgb10 255 191 0
#X rgb11 0 191 127
#X rgb12 127 0 127
#X rgb13 0 0 0
#X range 0.000 1.200
#X domain 0.000 22050.000
#X done
#P user spectroscope~ 336 266 200 200 20 0 1 3 0 1 0 0 0 0 0 0
#X frgb 224 224 224
#X brgb 255 255 255
#X rgb2 0 0 0
#X rgb3 243 204 204
#X rgb4 255 0 0
#X rgb5 184 184 184
#X rgb6 0 0 0
#X rgb7 0 0 0
#X rgb8 255 255 255
#X rgb9 255 0 0
#X rgb10 255 191 0
#X rgb11 0 191 127
#X rgb12 127 0 127
#X rgb13 0 0 0
#X range 0.000 1.200
#X domain 0.000 22050.000
#X done
#P user ezdac~ 226 40 270 73 0
#P newex 31 231 87 196617 receive~ filtered
#P user spectroscope~ 230 266 66 200 20 1 0 0 1 1 0 0 0 0 0 0
#X frgb 224 224 224
#X brgb 255 255 255
#X rgb2 0 0 0
#X rgb3 243 204 204
#X rgb4 255 0 0
#X rgb5 184 184 184
#X rgb6 0 0 0
#X rgb7 0 0 0
#X rgb8 255 255 255
#X rgb9 255 0 0
#X rgb10 255 191 0
#X rgb11 0 191 127
#X rgb12 127 0 127
#X rgb13 0 0 0
#X range 0.000 1.200
#X domain 0.000 22050.000
#X done
#P user spectroscope~ 31 266 200 200 20 0 1 3 0 1 0 0 0 0 0 0
#X frgb 224 224 224
#X brgb 255 255 255
#X rgb2 0 0 0
#X rgb3 243 204 204
#X rgb4 255 0 0
#X rgb5 184 184 184
#X rgb6 0 0 0
#X rgb7 0 0 0
#X rgb8 255 255 255
#X rgb9 255 0 0
#X rgb10 255 191 0
#X rgb11 0 191 127
#X rgb12 127 0 127
#X rgb13 0 0 0
#X range 0.000 1.200
#X domain 0.000 22050.000
#X done
#P newex 285 164 57 196617 send~ raw
#P user umenu 31 40 100 196647 1 64 56 1
#X add none
#X add white noise
#X add pink noise
#P newex 31 76 62 196617 selector~ 2
#P newex 177 40 34 196617 pink~
#P newex 135 40 39 196617 noise~
#P newex 31 164 73 196617 send~ filtered
#P newex 31 138 27 196617 +~
#P newex 154 107 120 196617 tl.crossover4~ high 500
#P newex 31 107 118 196617 tl.crossover4~ low 500
#P window setfont “Sans Serif” 12.000
#P comment 31 14 100 196620 Select source
#P user panel 26 195 596 278
#X brgb 192 194 210
#X frgb 0 0 0
#X border 0
#X rounded 0
#X shadow 0
#X done
#P user panel 26 483 596 278
#X brgb 192 194 210
#X frgb 0 0 0
#X border 0
#X rounded 0
#X shadow 0
#X done
#P connect 9 0 3 0
#P fasten 9 0 4 0 36 99 159 99
#P fasten 9 0 11 0 36 99 290 99
#P connect 27 0 25 0
#P fasten 27 0 26 0 341 545 540 545
#P connect 24 0 22 0
#P fasten 24 0 23 0 36 545 235 545
#P connect 18 0 16 0
#P fasten 18 0 17 0 341 256 540 256
#P connect 14 0 12 0
#P fasten 14 0 13 0 36 256 235 256
#P connect 10 0 9 0
#P fasten 8 0 9 2 182 72 88 72
#P fasten 7 0 9 1 140 66 62 66
#P connect 5 0 6 0
#P fasten 4 0 5 1 159 131 53 131
#P connect 3 0 5 0
#P window clipboard copycount 31