i think i've hit the point where electronics and speaker design can only do so much. it's time to talk about acoustic room treatment.
two weeks ago, i was having sidewall-reflection problems. this means i was hearing too much reflected sound that had bounced off of the sidewalls of my listening room. this sound was interfering with the direct sound which traveled directly from the speakers to me.
of course, you're always hearing reflected sound. in fact, almost all the sound you hear in a typical living room is reverberated sound, which travels from the speakers to you after multiple reflections. without those reflections, you'd only hear a tiny part of your speaker's output, and you'd need enormous speakers to hear much at all. this is why outdoor speakers are enormous.
there is, however, one kind of reflected sound which i do need to control, and that is the first-reflection off of the sidewalls. it looks like this:
[direct sound (travelling directly to ear) and first-reflection (travelling from wall to ear).]
unlike the multiply-reflected reverberated sound, the first-reflection is much louder, arrives at the ear with a much shorter time delay, and is highly correlated with the direct sound. i find it quite audible and not very fun. so how can you control the first-reflections?
[sidewall with 1" of acoustic absorption materials - absorbing just the reflected highs.]
most people's first instinct is to cover their sidewalls with a thin layer of absorptive material. after some research they may also use 'fancy materials', such as 703 fiberglass. but a thin layer will only absorb the highest frequencies! if you are using mostly-omnidirectional speakers (as most of us are), that reflected sound is a big part of what you hear, and you're essentially cutting the highs out of the mix. what if you use thicker materials, to attenuate a wider range of frequencies?
[sidewall with 4" of acoustic absorption materials - absorbing the reflected mids and highs.]
here we've spent our money on much thicker layers of absorptive material, and can absorb both the mids and highs. sometimes this is a good solution, but i agree with certain experts that it generally is not, unless your room is tiny and desperately needs more absorption to reduce the reverberation time. this approach could leave you with a very dead-sounding listening space, and a huge disparity between the loudness of reverberated bass versus mids & highs!
one might ask - why not keep adding thicker and thicker layers of absorption until you can absorb the bass as well? you can indeed do that with bass traps, which are huge pieces of foam which can be mounted in the corners of rooms. the problem is, by then you've spent all your money, and you end up with a super-dead room which now requires enormous speakers, just like the great outdoors.
so instead of mounting absorbers on the sidewalls, i use diffusers instead. these are geometrically-complex surfaces which reflect sound in many directions. it looks like this:
[sidewall with acoustic diffuser - scattering the reflected mids and highs. nothing stops the bass!]
this also reduces the amount of sound which is reflected right at you. however, the rest of the sound is dispersed around the room, which adds to reverberation and doesn't upset the room's spectral balance.
so how does one construct these diffusers? if your blood is rich, you could buy and install professional diffusion panels. or you could construct your own (admittedly beautiful) Skyline diffusers. but even Floyd Toole just uses bookcases in his own house, and so shall i.
[right speaker is next to a bookcase with actual books.]
[if you own more e-books than books, you may have to use boxes and wooden panels instead.]
have you wondered why cinemas have padded seats? it's because people are squishy, and if the seats were less squishy than people, an empty cinema would sound substantially different than a full cinema. i take cues from cinema design, with an exceptionally squishy listening couch. all materials (pillows) are quite thick for broadband absorption.
[squishy things are also fun to sit on.]
a quick measurement of my reverberation time (RT60) places it around 0.3 seconds. that's surprisingly dry for a small living room! i blame the open door.
now that i've gone ahead and changed everything, it's time to re-equalize my speakers. so let's measure each speaker's frequency response from four positions on the couch (again):
[the microphone thinks it's people, part II.]
[frequency response of left speaker, 1/20 octave smoothing, in four listening positions: 1 (red), 2 (green), 3 (blue) & 4 (tan).]
[frequency response of right speaker, 1/20 octave smoothing, in four listening positions: 1 (red), 2 (green), 3 (blue) & 4 (tan).]
this time, i won't be trying to equalize all listening positions manually. there are some things computers are better at, and i accept my status as a squishy human. so it's time to break out the pythons.
(if you want to play with my scripts, extract this zip-file and run 'workspace 0.py')
so let's output my sweep data from HolmImpulse:
in Python, i can produce averaged frequency responses of all four positions. i weigh the frequency response of positions 2 & 3 slightly heavier because they are the prime seats (hoho).
then i can plot the 1/3-octave smoothed frequency response of all four positions:
[four-position weighted average of right speaker frequency response: raw response (grey) and 1/3 octave smoothed response (blue).]
[four-position weighted average of left speaker frequency response: raw response (grey) and 1/3 octave smoothed response (blue).]
why am i using 1/3-octave smoothing on my data if it hides dangerous defects, like the left speaker's null at 146Hz? because i don't want to be too aggressive in my room-equalization. i'm quite aware that the room response will change slightly as the listener fidgets on the couch. it doesn't make sense to have super-targeted equalization if it's no longer correct when the listener leans forwards or backwards by a few inches.
previously, i went back-and-forth between speaker response and filter response, tweaking until it seemed like they would cancel each other out. but while we're on a Python kick, why not import the averaged speaker response into Sigmastudio? then i can tweak it directly.
Sigmastudio supports import of MLSSA-format frequency responses, so i wrote a Python function which formats my waveform appropriately. it was very strange. apparently they care about having exactly the right amount of whitespace.
[signal chain for playing with room equalization.]
and now.. the best GIF.
once the frequency response is in Sigmastudio, you can just yank on levers until it is flat. what is the resulting DSP gain?
[right speaker DSP response, compensating for room response.]
it's quite interesting to identify each peak and dip in the DSP's response.
- 44Hz antinode: this room mode is our friend! the speaker requires less power at these frequencies.
- 146Hz node: this room mode is not our friend. the speaker needs tons of power to produce anything audible here.
- 500Hz baffle-step: caused by the transition from half-sphere to full-sphere radiation, also described here.
- high-frequency absorption: high frequencies are absorbed by almost everything - not much reaches the listener.
and here is the whole signal chain, now getting pretty big:
let's take more microphone measurements:
[corrected frequency response of left speaker, 1/20 octave smoothing, in four listening positions: 1 (red), 2 (green), 3 (blue) & 4 (tan).]
[corrected frequency response of right speaker, 1/20 octave smoothing, in four listening positions: 1 (red), 2 (green), 3 (blue) & 4 (tan).]
the frequency response at all listening positions is now pretty flat! i'm quite sure it's flat out to 20kHz - the slight dip at the highest frequencies match the high-frequency roll-off in my microphone's calibration data. admittedly, the left speaker still has that 146Hz null - that cannot be fixed electronically.
so i sat down and listened to a lot of music. and it really seems like a flat frequency response, while fantastic in the bass and mids, is pretty overwhelming in the highs. 's' sounds in voices can be quite screechy. snare drums try to rip out my ears. this effect is more severe on some albums than others. why is this happening?
well, most people don't equalize their rooms flat to 20kHz. most studios don't do it either. as far as i can tell, they generally buy speakers which are flat to 20kHz (as measured in an anechoic chamber), and then put them in a room where the high frequency reflections are highly attenuated. they may do some room correction (up to a few kHz, anyways) but most producers don't equalize flat to 20kHz. it's also worth noting that most studio headphones aren't flat to 20kHz either:
[plot made with HeadRoom's Build-a-Graph tool.]
so if speakers in studios have less gain at high frequencies, i'm betting the recording engineer will boost those frequencies to compensate. which leads to me sizzling my ears out when i hear those tracks with a 20kHz-flat frequency response. so how shall i compensate?
since i'm using a DSP, i've decided to add a high-frequency adjustment knob. by turning a knob, i can move a low-pass-filter anywhere from 20kHz to 5kHz, adjusting as needed to make things sound just right.
update: after more research, i've realized that equalizing flat with listening-position measurements only works for frequencies below ~300Hz. above that, the perceived frequency response is a complex mix of direct sound, first-reflections and reverberation, not all of which is captured in my measurements. in the upper treble, most of what we perceive is direct sound, which my speakers are quite capable of producing flat to almost 20kHz. so i must conduct further experiments - my 8.7kHz filter (below) probably works through dumb luck.
[right speaker average response, with high-frequency adjustment from 5kHz to 20kHz.]
having played with this knob quite a bit, i find that most music sounds best with the filter at 8.7kHz. so there it shall stay, until i get bored. and the DSP signal chain, of course, has swelled appropriately.
that's all for now!
next time: i try to do something about that 146Hz mode.