Jump to content

Using speclab for measuring in room


3ll3d00d

Recommended Posts

I started a thread on this over at avf then thought I'm more likely to get comments here :)

 

To recap... I currently have a single 15" sealed sub, soon to be upgrading to a dual UXL-18 sub and I would like to be able to do a before/after comparison to see just how much it's added. My signal chain is

 

HTPC -> firewire -> RME Fireface 800 -> Marantz AV7005 -> SpeakerPower SP-6000 -> sub

 

mic is a CSL calibrated EMM-6 to 5Hz

 

The RME is spec'ed to -0.1dB at 1Hz on the analogue output & the marantz is down a couple of dB at ~5Hz IIRC. The mic input is often high passed though. I doubt I'll be troubling the scorers at 5Hz but still....

 

A post on avs suggests how to use an FFT filter to offset the rolloff but I couldn't find any confirmation that this actually works so I tried it out & was pleased to see it does work perfectly. 

 

post-1440-0-16160800-1410556345_thumb.jpg

 

I'm a jriver user btw so have been using the mojave/desertdome's approach to extracting a mono wav using jriver to feed into speclab.

 

I'll post back once I get a chance to measure the rolloff & update that FFT filter. In the meantime, any suggestions/comments would be appreciated (given that speclab is not the most obvious app to use in the world!).

Link to comment
Share on other sites

I've worked through creating a filter to account for my measurement signal chain so thought I'd share that approach here. The basic approach for filtering in speclab comes from http://www.avsforum.com/forum/113-subwoofers-bass-transducers/1374817-how-spectrum-lab-mic-vs-digital.html however creating the filter itself is slightly more involved than that. It relies on http://www.holmacoustics.com/holmimpulse.php as this is the only freeware I've found that has the signal manipulation tools you need to do this without loads of script hacking to get the data in the right format.

 

Note that this approach is yet to be tested in anger but I thought I'd write it down first.

 

Create the frequency-amplitude response measurement for your signal chain

Setup your soundcard etc with a loopback connection in place over whatever you want to correct for (e.g. soundcard output to input)

Start HolmImpulse

 

"Device & Signal" tab

- Choose your input/output devices

- Set sample rate to 48kHz

- Set Logarithmic sine sweep as measurement method with start frequency = 1Hz

- Set signal length to 2^17

- Make sure mic calibration is not active

 

post-1440-0-04952800-1410710702_thumb.jpg

 

"Data Analysis" tab

- Set measurement data length FFT M = 15

- Check Normalise to 0

 

post-1440-0-56480600-1410710708_thumb.jpg

 

"Measurement" tab

Click measure in Slot A

Check the response looks like what you expect for signal chain rolloff (see example)

Give the measurement a sensible name to reflect what you measured

 

Click import in Slot B

Choose your mic cal file (NB: Holm has a tendancy to freeze and require killing if you give it a text file it doesn't understand) 

It should import and look recognisably like your mic cal file

 

Go to the Manipulation menu and select "Product (C = A * B)"

It should create a new measurement that obviously looks like a combination of the previous 2 measurements

 

post-1440-0-40011600-1410710763_thumb.jpg

 

Click export

- enter a filename

- Frequency tab: custom format, full frequency range, uncheck export phase, FFT-Frequencies  for frequency increments

- Text options tab: uncheck information header, comma separator, dot decimal separator

Click export frequency response

 

Open the file in a text editor, it should be a 2 column csv with 16384 rows (if it has more or less rows then you might need to fiddle with the signal length to get it to match, I'm not 100% sure why it's not always honouring the FFT length for the export)

 

Create a basic speclab filter file

Open speclab

Open the filter control window

Set type = lowpass, FFT = 32768, Center = 24000, BW/Slope/Freq = 0

Set Graph scale in Opt 2 to -20/+20

Go to export tab, export to a file

 

post-1440-0-91523700-1410710927_thumb.jpg

post-1440-0-66656700-1410711266_thumb.jpg

post-1440-0-19052400-1410711271_thumb.jpg

 

Open the filter in a text editor, you should see something like

 

; Parameters for an FFT filter - saved by Spectrum Lab

; Original filename: "C:\public\gdrive\roomeq\speclab\basic_filter.FRS"

filter_type=1

options=64

resp_length=16385

fc_hz=24000.000000

bw_hz=0.000000

sw_hz=0.000000

fshift_hz=0.000000

inv_from_hz=0.000000

inv_to_hz=0.000000

array=

1,0,1

1,0,0.937469

1,0,0.874939

.

.

end

 

The array should have 16385 lines (i.e. the value in the resp_length field)

 

NB: not sure what the last two values in each array entry are (seems to vary with filter type)

 

NB: the array is a textual description of the filter response where the 1st column is the filter strength in a linear scale (1 = 0dB) and each row represents a frequency step of 24000/16385 = 1.464844 Hz and the 1st row corresponds to the filter strength at 0Hz

 

NB: you can use different values for resp_length if required, this corresponds to the value in the "FFT Size (points)" dropdown and will be (FFT Size (points) / 2) + 1  (i.e. 16385, 32769 and so on)

 

NB: you may need to edit the filter file to set filter_type=0 (this represents the custom type)

 

Linearise your measured response

The simplest way to do this is to use awk, you can get this via cygwin ( look at http://stackoverflow.com/questions/21927944/how-to-run-an-awk-commands-in-windows for details. 

 

Assuming the data exported from holmimpulse is hi_export.csv you would use



$  awk -F"," 'BEGIN {OFS=","} {print 10 ** (( $2 * -1) / 20 ),"0,0"}' hi_export.csv > hi_export_linear.csv


This means take field 2 of your csv (the amplitude measured in holm), invert it (because we want a filter that offsets your rolloff), linearise it by doing 10^(val/20) and then dump it out as a csv with 0 in the final 2 (mystery!) fields

 


 

Create the final filter file

All that is left is to take the output from the last step and dump it into array field in the filter file (i.e. copy and paste the hi_export_linear.csv contents inbetween array= and end in your filter file).

 

Now go to the filter screen

- graph: zoom in so you can see the 0-160Hz range 

- opt 2 tab: set the graph limits to the min/max strength of your filter 

- import/export: choose your final filter file and click load

- return to the graph screen and it should show a shape that looks like your signal chain rolloff (hover the mouse over the line and manually verify that various points look correct, e.g. 5/10/15/20Hz)

 

If the shape looks good then double check your array has the right number of entries, if everything is ok then the end statement should be on row 16398 in the file. IF THIS IS NOT CORRECT THEN THE FILTER WILL LOAD NORMALLY BUT SPECLAB WILL SILENTLY REJECT IT WHEN YOU APPLY IT!!

 

NB: you probably want to manually limit the frequency to which you filter, to avoid massively overboosting the low end; e.g. if I measure to 1Hz with my portable mic interface then it thinks I need +70dB at 1Hz which might well be true but is obviously dumb, my mic cal goes to 5Hz so that might be a sensible place to stop. Remember that each row represents about 1.46Hz so stopping at ~5Hz means copying row to rows 1-4 in the array.

 

Activate the filter in speclab 

This is as per the avs post

 

goto components/show components

Left click on the L1 button next to spectrum analyser and choose L4=Left Filter

 

return to the filter screen

make sure the buttons show started and bypass (click them if not)


 

post-1440-0-01134100-1410711290_thumb.jpg

 


return to the components screen

the filter should now be blue   

 

post-1440-0-48381800-1410711291_thumb.jpg

 

If everything has gone smoothly, then the filter should be applied when you measure....

 

IF THE FILTER LINE REVERTS TO A STRAIGHT LINE AT 0 when you apply it then this means your filter is invalid in some way

Link to comment
Share on other sites

I've always had a problem with calibration files. The recent spate of graphs with large content at 1 Hz being described as noise on the soundtrack is suspect to me, for example. That sort of spike in noise shows a production chain with zero roll off and a noise floor that doesn't quite compute without more info (for me, anyway).

 

In any case, it always helps me to start with a loopback measurement of your signal chain frequency response magnitude. That's what tells me what the roll off is and allows me to compare that to the 'correction' curve to see if it makes any sense.

 

I'd surely love to see a loopback measurement of the Marantz. ;)  I've seen a couple of them and they were vastly different, which I doubt is the case in reality, so I chalk it up to cal files being used vs not being used with no labeling of the graphs when posted.

 

I'd also love to see the roll off of the SP amp. This is simple to do. You just do a loopback using the speaker terminals and just make sure the levels on the amp are low enough to be feeding the sort of voltage the rest of your line level components are feeding the sound card or interface.

Link to comment
Share on other sites

there's a measurement of the AV7005 here - http://www.avsforum.com/forum/113-subwoofers-bass-transducers/1477487-if-you-needed-_4_hz-room-but-could-pick-room-how-would-you-2.html#post24815319

 

post-1440-0-76862900-1410721618_thumb.jpeg

 

The green line is the AV7005 with a cal file applied to cancel out everything else in that chain. It doesn't seem to add much rolloff itself. I've changed setup since then (put the RME FireFace in) so will repeat that measurement this week. I'll see if I can do the speakerpower as well (without frying anything!).

 

The curve shown in the earlier post is of a different interface that I use with my laptop (an ART USB Dual Pre) btw.

Link to comment
Share on other sites

The next thing I need to do is actually get my mic (Dayton emm6) working with it. I have tried on 2 different machines with 2 different interfaces and all I seem to get is some sort of periodic noise. This is with no filter attached, just a plain vanilla setup in speclab.

 

The mic definitely works as I can fire up an RTA and see a realistic trace of whatever sound I am using to test the mic.

 

Any ideas?

Link to comment
Share on other sites

The next thing I need to do is actually get my mic (Dayton emm6) working with it. I have tried on 2 different machines with 2 different interfaces and all I seem to get is some sort of periodic noise. This is with no filter attached, just a plain vanilla setup in speclab.

 

The mic definitely works as I can fire up an RTA and see a realistic trace of whatever sound I am using to test the mic.

 

Any ideas?

just to close this one... seems like the problem was a bit depth mismatch between speclab settings and the soundcard settings.

Link to comment
Share on other sites

I'd surely love to see a loopback measurement of the Marantz. ;)  I've seen a couple of them and they were vastly different, which I doubt is the case in reality, so I chalk it up to cal files being used vs not being used with no labeling of the graphs when posted.

 

I'd also love to see the roll off of the SP amp. This is simple to do. You just do a loopback using the speaker terminals and just make sure the levels on the amp are low enough to be feeding the sort of voltage the rest of your line level components are feeding the sound card or interface.

I repeated my loopback measurements in preparation for trying some mic captures in my room. Yellow is the RME FireFace 800 alone, blue is the RME FireFace 800 + AV7005 (7.1 analogue input, pure direct).

 

At 5Hz, the pairing is 2dB down with the rolloff roughly split between the 2 (maybe 1.2dB to the FF and 0.8dB to the Marantz).

At 10Hz, this becomes about 0.5dB.

 

post-1440-0-83235700-1410902092_thumb.png

 

I then tried to repeat for a RME - Speakerpower loopback and instantly sent the SP into protection mode. I was quite careful with connections and the signal level going through it but clearly did something wrong, no idea but don't fancy risking that again!

Link to comment
Share on other sites

First attempt at a mic capture in room, speclab seems to want a *really* low level on the mic pre amp gain. I turned it most of the way down (which means the max input level allowed on the interface will be rather high indeed) yet speclab still seems to suggest it's verging on clipping. It's not entirely clear which knobs need tweaking, answers on a postcard please!

 

post-1440-0-55292200-1410991470_thumb.jpg

 

 

Link to comment
Share on other sites

The problems above turned out to be bad settings (bits/sample). I now have it working correctly (I think) so some pics....

 

First, my in room steady state response at normal sweep levels for reference

 

post-1440-0-67440400-1411229565_thumb.png

 

the overall levels over the whole FoTP barrel roll clip (above 4mins long, taken from one of those avs demo discs). Top is the disc, bottom is in room.

 

post-1440-0-17958700-1411229567_thumb.png

 

and a gif comparing the in room vs on track for the barrel roll itself (the vertical line at the bottom is the roll). 

 

post-1440-0-36784400-1411246209_thumb.gif

Link to comment
Share on other sites

  • 7 months later...

you can also use this method to create a mic cal file only by importing that into Holm and then exporting it again

 

I find that if you do this, it will always export it to 32768 data points and hence you can either use an appropriately sized filter in speclab (resp_length = 32769) or you can cut it down in awk by filtering like so

$  awk -F"," 'BEGIN {OFS=","} NR % 2 == 0 {print 10 ** (( $2 * -1) / 20 ),"0,0"}' hi_export.csv > hi_export_linear.csv

the NR%2==0 bit means to only output every 2nd record (i.e. if record number divided by 2 has a remainder of 0 then output the record)

 

(I also tweaked post 2 with some minor changes, speclab is quite picky about how you feed data to it so it can take a bit of to and fro to get this to work)

Link to comment
Share on other sites

  • 2 months later...

I used a different laptop to generate a filter yesterday and hence noticed a few extra things about the above process that you need to be aware of otherwise you'll get bad data out.

 

The key point is making sure that Holm and speclab are configured with the same sample rate

 

- in holm this is set on the "device and signal" tab

 

post-1440-0-35289900-1438194584_thumb.jpg

 

- the resulting fft bin width can be found on the next tab, in this example I have a 48kHz sample rate and 65536 bins resulting in a resolution of 0.73Hz (48000/65536 ~= 0.73)

 

post-1440-0-37578400-1438194667_thumb.jpg

 

This value tells you the resolution in the data you export from Holm, each data point (row) represents the value at  (row number - 1) * 0.73 Hz

 

This fft size is the resp_length value in the filter file and resp_length must be set to (holm fft length / 2) + 1 so in the example shown we must set resp_length to 32769 like so

; Parameters for an FFT filter - saved by Spectrum Lab
; Original filename: "C:\Users\Matt\Documents\flat_filter.FRS"
filter_type=0
options=0
resp_length=32769

Once you load this into speclab then there are a few places in the filter control window that will verify everything is in agreement

 

post-1440-0-13815200-1438195154_thumb.jpg

 

 

 

 

 

 
Link to comment
Share on other sites

Archived

This topic is now archived and is closed to further replies.

×
×
  • Create New...