PC music players

Status
Not open for further replies.
That is an interesting read....

I noticed:

Barton: Right. That's the challenge, to get the tweeter—whose directivity at its lowest frequencies is very good—low enough so that doesn't happen. And you don't want the midrange driver or woofer to be pushed [high enough in frequency] that it becomes very directional.

Isnt that the opposite of what you sugested above?
 
Octave filter program

It's great to see the activity rebound on this topic. I'll have fun reading all the new posts but first here is the Octave program I used yesterday. Please note that the frequency plots are not correct and you have to get what you want interactively using freqz after the program runs. Remember you need octave-forge in order to have access to the fir functions.

n=16 generates 64k tap filters, which is what I'm using atm.

-Robert

#
# Robert Scheer 10/6/2004
#
n=16; # exponent for filter size
fxo1=35; # sub-sonic cutoff frequency in Hz
fxo=2600; # main 2-way crossover frequency in Hz
fs=44100; # sample rate in Hz
k=2^n; # order of filter
fn1=2*fxo1/fs; # normalized subsonic cutoff frequency
fnxo=2*fxo/fs; # normalized xo frequency
i=linspace(1,k,k); # k-tap filter array
f_lo=linspace(0,200,512); # for plot of low end of freq response
f_hi=linspace(0,20000,512);# for plot of entire freq response
hir=fir1(k,fnxo,'high','scale'); # high-pass impulse response
lir=fir1(k,[fn1,fnxo],'pass','scale'); # low-pass ir
hirtxt=hir(i); # my klugey way of taking k elements
lirtxt=lir(i); # from the k-element impulse responses
save -ascii /home/rfs/hiraw hirtxt
save -ascii /home/rfs/loraw lirtxt
freqz(hir,1,f_hi,44100)
freqz(lir,1,f_lo,44100)
freqz(lir,1,f_hi,44100)
 
Subsonic high pass

MWP,

I can't wait to go look at your new updates but first let me answer your question:
So your putting the stereo input through a highpass before the other xover filters?
What is the -3db frequency of it?

I did not make a separate subsonic filter. I just made the "low pass" into a "pass-band" filter with cutoffs at 35Hz and 2600Hz. They are super-steep as you will see when you crank the Octave script.

I'm sure some of you will find issues with my current technique and I'm hoping to benefit from your tips. So far, I have found that the larger the filter the better, except for delay and cpu-loading of course.
 
MWP - You MUST tell ALL!!!!

VERY IMPRESSIVE, to say the least. I just looked at your 2 photos and am blown away.

I love how you combined the amps on board with the dacs. You've got 2 channels on each board, with 2 parallel- or bridge-config gainclone amps per channel. I'm assuming parallel to handle the 4 ohm-ish drivers. Which amp chip?

What receiver and dac chip? Some burr-brown model of dac and crystal receiver, right?

What's the big black box in the middle?

What kind of fancy clocking are you using?

Optical SPDIF is quite intriguing. Especially how do you get 3 optical outs from your soundcard?

And just what kind of soundcard did you end up with and how did you modify it?

And and and and and ..... How does it sound? ???

WOW!

-Robert
 
Re: Re: Loudspeakers and x-over freq

MWP said:


If i xovered at 3Khz, the woofers off-axis levels would be very different to those of the tweeter.


I meant small midwoofers, 6.5" in my books are quite a big, besides metal cone speakers ever can't be crossed quite high - because of the cones are so pistonic they are also have strong directivity. Soft cone drivers on the other hand have the cone breakup effect which makes only part of cones to move so the active cone area actually gets smaller towards higher frequencies. But that's not true with metal cones (or other 'hard' cones). Actually I've seen speakers with paper cone Excels crossed over at 5.5 kHz (Penaudio Chrarisma reviewed @OnHifi).

Robert's Vifa studio kit has got 14 cm pp cone drivers which can be crossed higher than metal cone. Anyway, at 3Khz the 60 degree off-axis response is 6 dB down for PL14 and 3 db down with XT25 (it's ok), but at 2 kHz they were within 1 dB. I suggest trying that lower frequency, though I've heard that XT25 shouldn't be crossed too low (that's maybe a case with passive and less steep crossovers).

For W18 1.5 kHz with steep digital filters is fine as long as the tweeter can do it, indeed it looks like optimal cross over frequency also for H535 (is that the frequency you are using, MWP?).

Also in addition to crossing over you should also take care of baffle step compensation - without it your speakers will be really bass shy. If you use DRC with measurement mic the system should compensate for the baffle step. Usually the BSC (baffle step compensation) is max. 6 dB rollof from ~100 Hz to ~450 Hz (depends on speaker dimensions).
 
MWP,

Yes Barton discussed that directivity problem. It's problem only if it doesn't match the polarity pattern of tweeter. Also he wrote that a speaker with too much directivity at higher frequencies won't maybe get enough energy from the room and sounds different (don't remember the word he used). Yes, the main things are on-axis response and controlled directivity, off-axis response should be controlled, not flat, actually a flat speaker sounds too bright, response should roll off little bit towards higher frequencies. actually it's the room and the speaker together which makes the sound, you should just to be able to pick or design a speaker for a given space.

Yes I agree, MWP's DAC and amps are nice.

-Mikko
 
Re: MWP - You MUST tell ALL!!!!

VERY IMPRESSIVE, to say the least. I just looked at your 2 photos and am blown away.

I love how you combined the amps on board with the dacs. You've got 2 channels on each board, with 2 parallel- or bridge-config gainclone amps per channel. I'm assuming parallel to handle the 4 ohm-ish drivers. Which amp chip?

Ive been thinking about building this setup ever since i discovered BruteFIR a few years ago.
Im very happy now its all going.

Schematic is here:
http://www.overclockers.com.au/~mwp/temp/mwp-dac-amp1.pdf

Amp ICs are LM3886T's running bridged using the ballanced outputs from the amp IC's.
Ive never had a problem with 4ohm loads at the levels i run them at (they clip quite nastily if they cant drive a low load, and ive never had that problem).

What receiver and dac chip? Some burr-brown model of dac and crystal receiver, right?

DIR1703 & PCM1798.

What's the big black box in the middle?

The DPDT relay for the two step volume control.
THe ananlog audio signal never leaves the PCB.

What kind of fancy clocking are you using?

None... just a decent crystal for the DIR1703.
No reclocking.

Optical SPDIF is quite intriguing. Especially how do you get 3 optical outs from your soundcard?

Like this:
http://www.overclockers.com.au/~mwp/gallery/thumbs.php?sub=My DIY/MAudio Revo SPDIF Mods

And just what kind of soundcard did you end up with and how did you modify it?

MAudio Revolution 7.1.
I removed the DAC that handles the rear & sub channels and picked off the I2S which i then fed to three TI spdif transmitter ICs.

And and and and and ..... How does it sound? ???
WOW!

So far, very very good.
And thats without DRC and any kind of real speaker response tuning (ive yet to buy a good measuement mic).

The whole idea behind the integrated DAC+AMP was to remove all possibilites of the ground loop problems ive had in the past.
It has done that very well... i can put my ear to the speakers and hear absolutley nothing.
 
Re: Subsonic high pass

I can't wait to go look at your new updates but first let me answer your question:

I did not make a separate subsonic filter. I just made the "low pass" into a "pass-band" filter with cutoffs at 35Hz and 2600Hz. They are super-steep as you will see when you crank the Octave script.

Ahh, i see.
Well ive just tried putting a 10Hz highpass on my inputs in brutefir.
Not quite sure of its effect as yet... but itll probably be a good thing to leave there anyway.

Ive moved up to 32k filters... the delay is a little long, esp as i do watch movies using this setup.
CPU load is still only ~11% though.
 
Re: Re: Re: Loudspeakers and x-over freq

I meant small midwoofers, 6.5" in my books are quite a big, besides metal cone speakers ever can't be crossed quite high - because of the cones are so pistonic they are also have strong directivity....

For W18 1.5 kHz with steep digital filters is fine as long as the tweeter can do it, indeed it looks like optimal cross over frequency also for H535 (is that the frequency you are using, MWP?).

Ahh, i see.
I have moved it up to 2.8Khz now to try wht i thought you were sugesting, but ill now move the xover back to 1.5Khz where it does seem to be best.
Power handling for the tweeters shouldnt be a problem, i dont run them at high volumes that often.
For when i do, i might make up a different filter set with a higher xover.

Also in addition to crossing over you should also take care of baffle step compensation - without it your speakers will be really bass shy. If you use DRC with measurement mic the system should compensate for the baffle step. Usually the BSC (baffle step compensation) is max. 6 dB rollof from ~100 Hz to ~450 Hz (depends on speaker dimensions).

Hmmm, thanks, ill have to look into this further.
I am not running DRC yet due to the lack of a good mic, but when i do get one, im sure all will be revealed 😉
 
I'm yet to try BruteFIR, but if my memory serves it is possible to drop down the CPU% by increasing the partition size for BruteFIR. You know, BFIR uses partitioned convolution in which the filter is divided to smaller partitions. That reduces I/O latency (not FIR delay, you can't avoid it).

This from BFIR documentation:
"The filter_length setting specifies how long the filters should be. This can be done in two ways. Either by specifying the length in one number, which must be a power of two. If so, the convolution will be done on the whole filter length. To partition a 65536 tap filter in 16 parts, you write filter_length: 4096,16. Partitioned filters can be used to improve performance and reduce I/O-delay. "

So by decreasing the filter_length setting for the number of parts you increase latency but decrease CPU%.

For 64k you could try setting

filter_length: 4096,16; # length of filters


in ~/.brutefir_defaults file. That makes every partition 1024 samples long. If that's your setting now you could try setting

filter_length: 8192,8; # length of filters

and so on until you find reasonable values.

I'm gonna try DAC's and DSP from Wavefront.

The DSP is quite limited as it's maximum FIR filter size is 1024 samples. I'm building some nearfield monitors for my home studio so there must be no delay so I'm going to use a very short FIR xover filter (~88 samples = ~ 1 ms delay) + optional driver EQ FIR (~880 samples = 10 ms delay) for mixdown use where the delay doesn't matter, and an alternative IIR filter for recording (just for baffle step correction and subsonic). Also the IIR xover filter is option if the FIR xover still makes too long delay (in 1 ms sound can travel only 0,34 meters so that shouldn't be too long delay).

Btw. Digi01 is selling LM3886 PCB's for very low price at group buy forum, grab them while you can (open till 10th Oct). I'm going to use them for powering my 4 ohm Dynaudio 15W75 woofers, 'regular' gainclone amp are no good with that low impedances. However, the Hypex UcD180 amps (www.hypex.nl, see the digital amplification forum @diyaudio) are on my shopping list for final amps, class-D rules!

-Mikko
 
Edge diffraction

When you design your speakers for the design of the driver placement on the front baffle use this small app to find the best dimensions for the baffle and the best locations for the elements:

Edge

Is that enough of speaker design now?

-Mikko
 
fir2

See the usage below.

n = 88;

grid_n = n ^ 2;

What means "power of 2 bigger than n"?

ramp_n = grid_n / 20; is the default, try wider transition band like

grid_n / 10;

Window with kaiser (is that available, hanning might be the next best, hamming default is not so good).

----------------
fir2 [Download]usage: b = fir2(n, f, m [, grid_n [, ramp_n]] [, window])
Produce an FIR filter of order n with arbitrary frequency response,
returning the n+1 filter coefficients in b.
n: order of the filter (1 less than the length of the filter)
f: frequency at band edges
f is a vector of nondecreasing elements in [0,1]
the first element must be 0 and the last element must be 1
if elements are identical, it indicates a jump in freq. response
m: magnitude at band edges
m is a vector of length(f)
grid_n: length of ideal frequency response function
defaults to 512, should be a power of 2 bigger than n
ramp_n: transition width for jumps in filter response
defaults to grid_n/20; a wider ramp gives wider transitions
but has better stopband characteristics.
window: smoothing window
defaults to hamming(n+1) row vector
returned filter is the same shape as the smoothing window
To apply the filter, use the return vector b:
y=filter(b,1,x);
Note that plot(f,m) shows target response.
Example:
f=[0, 0.3, 0.3, 0.6, 0.6, 1]; m=[0, 0, 1, 1/2, 0, 0];
[h, w] = freqz(fir2(100,f,m));
plot(f,m,';target response;',w/pi,abs(h),';filter response;');
 
octave kaiserord

Also check out this one:

kaiserord [Download]usage: [n, Wn, beta, ftype] = kaiserord(f, m, dev [, fs])
Returns the parameters needed for fir1 to produce a filter of the
desired specification from a kaiser window:
n: order of the filter (length of filter minus 1)
Wn: band edges for use in fir1
beta: parameter for kaiser window of length n+1
ftype: choose between pass and stop bands
b = fir1(n,Wn,kaiser(n+1,beta),ftype,'noscale');
f: frequency bands, given as pairs, with the first half of the
first pair assumed to start at 0 and the last half of the last
pair assumed to end at 1. It is important to separate the
band edges, since narrow transition regions require large order
filters.
m: magnitude within each band. Should be non-zero for pass band
and zero for stop band. All passbands must have the same
magnitude, or you will get the error that pass and stop bands
must be strictly alternating.
dev: deviation within each band. Since all bands in the resulting
filter have the same deviation, only the minimum deviation is
used. In this version, a single scalar will work just as well.
fs: sampling rate. Used to convert the frequency specification into
the [0, 1], where 1 corresponds to the Nyquist frequency, fs/2.
The Kaiser window parameters n and beta are computed from the
relation between ripple (A=-20*log10(dev)) and transition width
(dw in radians) discovered empirically by Kaiser:
/ 0.1102(A-8.7) A > 50
beta = | 0.5842(A-21)^0.4 + 0.07886(A-21) 21 <= A <= 50
\ 0.0 A < 21
n = (A-8)/(2.285 dw)
Example
[n, w, beta, ftype] = kaiserord([1000,1200], [1,0], [0.05,0.05], 11025);
freqz(fir1(n,w,kaiser(n+1,beta),ftype,'noscale'),1,[],11025);
 
My new Matlab script:

Code:
sub = 60;
sub_width = 10;
sub_accr = [0.01, 0.05];
mid = 2200;
mid_width = 50;
mid_accr = [0.001, 0.001];
fs = 22050;
coeffs = 8192;

f = [sub, sub+sub_width];
m = [1, 0];
dev = [0.0005, 0.0005];
[n, w, beta, ftype] = kaiserord(f, m, dev, fs);
out = fir1(n,w,ftype,kaiser(n+1,beta),'scale');
l = length(out);
t = zeros(1,coeffs);
if coeffs < l
	s = round((l - coeffs) / 2);
	e = l - s - 1;
	for n = s:e
		t(1,n-s+1) = out(1,n);
	end
else
	s = round((coeffs - l) / 2);
	for n = 1:l
		t(1, n+s) = out(1, n);
	end
end
sub_low = t;

f = [sub, sub+sub_width];
m = [0, 1];
dev = [0.0005, 0.0005];
[n, w, beta, ftype] = kaiserord(f, m, dev, fs);
out = fir1(n,w,ftype,kaiser(n+1,beta),'scale');
l = length(out);
t = zeros(1,coeffs/2);
if (coeffs/2) < l
	s = round((l - (coeffs/2)) / 2);
	e = l - s - 1;
	for n = s:e
		t(1,n-s+1) = out(1,n);
	end
else
	s = round(((coeffs/2) - l) / 2);
	for n = 1:l
		t(1, n+s) = out(1, n);
	end
end
sub_high = t;

f = [mid, mid+mid_width];
m = [1, 0];
dev = [0.000005, 0.000005];
[n, w, beta, ftype] = kaiserord(f, m, dev, fs);
out = fir1(n,w,ftype,kaiser(n+1,beta),'scale');
l = length(out);
t = zeros(1,coeffs/2);
if (coeffs/2) < l
	s = round((l - (coeffs/2)) / 2);
	e = l - s - 1;
	for n = s:e
		t(1,n-s+1) = out(1,n);
	end
else
	s = round(((coeffs/2) - l) / 2);
	for n = 1:l
		t(1, n+s) = out(1, n);
	end
end
mid_low = t;

f = [mid, mid+mid_width];
m = [0, 1];
dev = [0.000005, 0.000005];
[n, w, beta, ftype] = kaiserord(f, m, dev, fs);
out = fir1(n,w,ftype,kaiser(n+1,beta),'scale');
l = length(out);
t = zeros(1,coeffs);
if coeffs < l
	s = round((l - coeffs) / 2);
	e = l - s - 1;
	for n = s:e
		t(1,n-s+1) = out(1,n);
	end
else
	s = round((coeffs - l) / 2);
	for n = 1:l
		t(1, n+s) = out(1, n);
	end
end
mid_high = t;

mid_low = conv(mid_low, sub_high);

save -ascii -double d:\sub_low.txt sub_low
save -ascii -double d:\mid_low.txt mid_low
save -ascii -double d:\mid_high.txt mid_high
 
excellent thread. I think what the original poster is after is that there is really no good reason why the PC can't be a much more full featured comparable sounding a/v source. This is ESPECIALLY true since everything is going to digital. I haven't had anyone actually explain a -good- reason to me why an audio signal shouldn't leave the digital domain until the analog out to the amplifier. When you think about the digital processing power available on available on PCs there should be no reason for all extremely marked up separate hardware before the amplifier stage.

Anyway .. I'm excited about the possibility of a bunch of these audio functions moving to the PC. I already use a very quiet pc with virtual desktop software and an m-audio digital out to my receiver. I plan to add a PVR mpeg 2 card from hauppage soon to turn it into a 'tivo' like machine.

I'm really excited about the DSP potential though. We -should- be able to totally leave passive crossovers in the dust one of these years. We should have very smart EQing capabilities. Time correction, surround sound ..etc. There is absolutely no reason the power cpus of today, complemented with separate specialty DSPs when necessary can't beat out some extremely marked up fancy looking box with nice brand name on it.
 
kfr01 said:
I'm really excited about the DSP potential though. We -should- be able to totally leave passive crossovers in the dust one of these years. We should have very smart EQing capabilities. Time correction, surround sound ..etc. There is absolutely no reason the power cpus of today, complemented with separate specialty DSPs when necessary can't beat out some extremely marked up fancy looking box with nice brand name on it.

People are doing it already.
Im 1/2 way there.
All i need is a good measument mic, then i can start doing DRC and time-alignment.
 
AlmusVCU

Has anyone here tried AlmusVCU by Anders Torger? It relies on BruteFIR and is designed for ambiophonics and ambisonics. What I found most interesting is that it's designed to be able to be run from a DSP chip. I actually saw a prototype of this a year or two ago while at Ralph Glasgal's Ambiophonics Institute, although I didn't realize it at the time, nor did I know Anders was behind the programming.

Anywho, I don't know anything about programming DSPs, but, I have read that they're supposed to be much more efficient at processing than the typical CPU. Putting BruteFIR's capabilities on an external DSP chip would allow many more possibilities for connections and DACs than with computer soundcards. One could use a Windows PC with an AES-16 as a front-end music and dvd server and TiVo, then output 6 or 8 channels to AES receivers, into the DSP(s), then DIY DACs and into UCD400s. Sounds sweet. Upgrading would be much cheaper (and much more fun) than replacing a DEQX when the hardware becomes outdated.

Alternatively, AlmusVCU can be programmed via an LCD. Put AlmusVCU on a computer in this case http://www.atechfabrication.com/products/heatsync_6000.htm
with a VFD or touchscreen and an RME card and you could have a lot of fun.

MWP -- are you coding your filters? Or designing them graphically in MATLAB and then tweaking them by hand?
 
Status
Not open for further replies.