• Welcome to ASR. There are many reviews of audio hardware and expert members to help answer your questions. Click here to have your audio equipment measured for free!

Introducing DSPi | A powerful, user friendly and open source DSP for less than a cup of coffee

I haven't seen counter increment at dropout but I will look for this
It's always brief silence
It clearly happens often (and in sync) when I'm opening a window or hotmail message on the PC but also happens when I'm not opening anything
Very interesting. In the current implementation, the underrun counter records packet arrival gaps between 2ms and 50ms. It is suppressed during USB stream start/stop. If you are not seeing the underrun counter incrrement during dropouts, it means that the host is late by more than 50ms.

If you are experiencing activity-correlated dropouts, it suggests to me that the host is late when under load and causing a pipeline blockage. The packet burst when the host resumes may also be driving the feedback to high values that encourage the host to perform a stream reset.

I suspect that your system might have a lateness issue with other devices as well but they simply drop and crossfade the missing samples to avoid blocking. What I will have to do is place the testbed system under intermittent load and see if I can trigger the same behavior.
 
The commas should not be present. This is a bug that I will address in a hotfix. Did you import those filters from a text file?
I also have the same comma problem (without using a text file either).

Also, sorry to insist, but there's still this issue with the delay display when entering decimals in the Matrix Mixer... it might seem insignificant, but without it, active filtering is impossible, and therefore I can't continue testing the project. It's not super urgent since the current filters (Butt, LR, Bessel...) are still missing. But I don't think it will be very complicated to fix... (Then again, perhaps this isn't technically possible with the DSPi...!?)

Just to further support my previous points on this issue of delay and the importance of being able to adjust it to the microsecond, here are three examples of delay support from two DSP consoles and a speaker design software:

VituixCad :
Delay (VituixCad).jpg


MiniDsp Device Console :
Delay (miniDsp Device Console).jpg


Hypex Filter Design :
Delay (Hypex Filter Desig).jpg



Thank you (also for tolerating my monomaniacal obsessions).
 
I also have the same comma problem (without using a text file either).

Also, sorry to insist, but there's still this issue with the delay display when entering decimals in the Matrix Mixer... it might seem insignificant, but without it, active filtering is impossible, and therefore I can't continue testing the project. It's not super urgent since the current filters (Butt, LR, Bessel...) are still missing. But I don't think it will be very complicated to fix... (Then again, perhaps this isn't technically possible with the DSPi...!?)

Just to further support my previous points on this issue of delay and the importance of being able to adjust it to the microsecond, here are three examples of delay support from two DSP consoles and a speaker design software:

VituixCad :
View attachment 524482

MiniDsp Device Console :
View attachment 524483

Hypex Filter Design :
View attachment 524485


Thank you (also for tolerating my monomaniacal obsessions).
Not to worry; I will be adding support for this in both applications shortly. :)

Regarding filter types, one solution that I have been considering is a transition to a tabbed approach for the output channel pages. We might have a "PEQ" tab and a "Crossover" tab, each with user assignable numbers of filters.
 
Last edited:
I really like this application and am willing to help if you need. I currently use Camilla with an RPI5 (and spdif optical input) and 8 channel hat but would love to replace that with DSPi and a few good DACs.

Anyway, congrats on the I2S 24/96 output, now I just need SPDIF input. However, a couple of things->

1) It forgets that I've picked I2S when the board restarts which makes it awkward at best since I don't want to have a pc plugged into it.

2) I'm getting skipped data that I'm pretty sure my software is not causing. The board is an Innomaker PCM5122 board that requires a 5V supply (I'm using Vsys) but seems compliant with the Pico outputV for the I2S lines. The skipped data point or 2 per 1S packet wanders. So, take this with a grain of salt. Anyway, here's a picture showing where the data clearly lost a point or two. It should be a sine wave but you can see the residual pointing at the not-round wave peak followed by too-close next peak. I looked at my data for nerbs and there's nothing about over or underruns but I am running I2S. This happens with both 48K and 96K (which I'm so glad you are now supporting).

One note that the board has two oscillators on it for jitter reduction.

It's entirely possible that the skip is inaudible.

1776111901405.png
 
Last edited:
I really like this application and am willing to help if you need. I currently use Camilla with an RPI5 (and spdif optical input) and 8 channel hat but would love to replace that with DSPi and a few good DACs.

Anyway, congrats on the I2S 24/96 output, now I just need SPDIF input. However, a couple of things->

1) It forgets that I've picked I2S when the board restarts which makes it awkward at best since I don't want to have a pc plugged into it.

2) I'm getting skipped data that I'm pretty sure my software is not causing. The board is an Innomaker PCM5122 board that requires a 5V supply (I'm using Vsys) but seems compliant with the Pico outputV for the I2S lines. The skipped data point or 2 per 1S packet wanders. So, take this with a grain of salt. Anyway, here's a picture showing where the data clearly lost a point or two. It should be a sine wave but you can see the residual pointing at the not-round wave peak followed by too-close next peak. I looked at my data for nerbs and there's nothing about over or underruns but I am running I2S. This happens with both 48K and 96K (which I'm so glad you are now supporting).

It's entirely possible that the skip is inaudible.

View attachment 524499
Thank you very much for the offer and the input. The output slot assignments are stored in the presets. If you save your parameters to the current preset and ensure it is configured either to load that specific preset upon boot or the last active one, it will always restore the output assignments.

How often does this skip occur and which operating system is this? Is it a fixed interval? There is a USB ISR ring overrun counter but it is not yet exposed in the applications, so I will be implementing this tonight. Myself and another developer have performed loopback tests of DSPi's SPDIF output and found it to be perfectly clean, so assuming this is not a DAC board issue, it must be unique to the I2S output.

Are you able to test the SPDIF output in the same fashion?
 
Not to worry; I will be adding support for this in both applications shortly. :)

Regarding filter types, one solution that I have been considering is a transition to a tabbed approach for the output channel pages. We might have a "PEQ" tab and a "Crossover" tab, each with user assignable numbers of filters.
Thank you so much, I was starting to despair! ;) And I'm glad to know it will be possible!

Yes, regarding the separation of the PEQ and crossover, that's what's done elsewhere, so I completely understand. That being said, the current configuration in this respect doesn't bother me either. But obviously, those familiar with this kind of thing, like myself, will find it very familiar!
 
I tried to change the MCK multiplier and got an error message: "Failed to set MCK multiplier"
Does anybody know what this multiplier is for and how to set it?
 
MiniDsp Device Console :
Hypex Filter Design :
I do not know about VItuixCad (and this is not a DSP), but let's have a look at the other two.

MiniDSP takes a lot of digits as input, but I very much doubt that this is actually implemented as delay.
Delay.png

With resampling it would be possible to do that, but I doubt that the Flex does so and i.e. Hypex does NOT.
The smallest delay in Hypex FA modules is actually a full sample. This might look like a microsecond resolution but it isn't. Steps are 21.33 µs (48kHz).
For practical purposes this is perfectly sufficient.


@Weeb Labs
But there seems to be a problem with defining and saving filters (MacOS version).
As mentioned before the numerical input does not work.
But on top of this, when saving/exporting a modified filter with changed Q only a generic filter is saved, the value for Q is ignored. (This happens with High/LowPass filters, other filters seem to work correctly here)
Even when creating specific filters (Bessel, LR and so on) in REW, the .txt file can be imported and works as intended (at least is shown in the graph), but when saved back the filter reverts to generic.
 
Last edited:
Just to further support my previous points on this issue of delay and the importance of being able to adjust it to the microsecond, here are three examples of delay support from two DSP consoles and a speaker design software:

The console application treats delay as a floating point number of milliseconds. This is translated in the DSPi software into the closest number of integer samples to delay each output.

That means that the delay applied is quantised to a grid of 1/FS, and the delay value achieved may change with sample rate. Unlike miniDSP/AD SigmaDSP, the processing pipline of DSPi runs at the input sample rate rather than being resampled onto a fixed clock.

Sub-sample delays can be made with an all-pass filter (see the cross-feed implementation) or approaches similar to the fractional-delay element in Analog Devices SigmaStudio. These are both differently compromised and are not precisely identical to a pure frequency independent delay.

If it is possible to use first or second order all-pass elements in VituixCad to achieve the driver alignment you want, those filters would be the most straightforward to implement in the DSPi.

The fractional-sample delay in SigmaStudio (and by extension anything using AD SigmaDSP) is quite a basic implementation, and certainly requires oversampling to achieve a flat frequency response to FS/2.
 
I do not know about VItuixCad (and this is not a DSP), but have a look at the other two.

MiniDSP takes a lot of digits as input, but I very much doubt that this is actually implemented as delay.
View attachment 524508
With resampling it would be possible to do that, but I doubt that the Flex does so and i.e. Hypex does NOT.
The smallest delay in Hypex FA modules is actually a full sample. This might look like a microsecond resolution but it isn't. Steps are 21.33 µs (48kHz).
For practical purposes this is perfectly sufficient.
Yes, you're absolutely right, and I'm familiar with this "paradox." However, I have two miniDSPs, the Flex8 and the NanoDigi, both operating at a fixed 96kHz rate (so resampling). As for the Hypex, I'm not sure; a friend has one, but I haven't fully read the documentation. That's why I was asking if it was technically possible to do the same thing with the DSPi... so that it's not just "cosmetic" but, more importantly, "effective."

This is a question I've been asking myself since there's no "hardware" reference clock on the Pico... well, there is the AEL12.0, but being practically clueless about electronics, it seems to me that it has no influence on the audio signal processing... Anyway, if we resample all incoming streams upstream of the DSPi at 96kHz (since it now supports this format), it should certainly be possible to get down to the microsecond level, right?

Otherwise, it doesn't really matter; once it's implemented correctly, I'll see how it goes. But even with steps of 21.33 µs (for 48kHz), it will still be better than steps of 1ms...
 
The console application treats delay as a floating point number of milliseconds. This is translated in the DSPi software into the closest number of integer samples to delay each output.

That means that the delay applied is quantised to a grid of 1/FS, and the delay value achieved may change with sample rate. Unlike miniDSP/AD SigmaDSP, the processing pipline of DSPi runs at the input sample rate rather than being resampled onto a fixed clock.

Sub-sample delays can be made with an all-pass filter (see the cross-feed implementation) or approaches similar to the fractional-delay element in Analog Devices SigmaStudio. These are both differently compromised and are not precisely identical to a pure frequency independent delay.

If it is possible to use first or second order all-pass elements in VituixCad to achieve the driver alignment you want, those filters would be the most straightforward to implement in the DSPi.

The fractional-sample delay in SigmaStudio (and by extension anything using AD SigmaDSP) is quite a basic implementation, and certainly requires oversampling to achieve a flat frequency response to FS/2.
Yes, that's a technical translation of my literary approximations... ;) but thank you for it! And for some details I didn't have. :)
 
I tried to change the MCK multiplier and got an error message: "Failed to set MCK multiplier"
Does anybody know what this multiplier is for and how to set it?
The MCK multipler sets the frequency of the optional master clock reference output. The standard values are 128xFs (6.144MHz at 48KHz) and 256xFs (12.288MHz at 48KHz), with the former currently preferred as it exhibits no fractional jitter at 48KHz. Any DAC without an onboard PLL requires a master clock.

There was a small issue with the vendor command in the current Windows release. I have now patched it and this will be rolled into the hotfix.
 
Last edited:
If it is possible to use first or second order all-pass elements in VituixCad to achieve the driver alignment you want, those filters would be the most straightforward to implement in the DSPi.
Indeed, being so used to my usual equipment, I had completely overlooked this possibility... thank you for this reminder!
 
So now with the latest Windows update I can finally try this out for real! ^^ Just had to do some soldering on these cheap PCM5102 boards, apparently some (mislabeled!) jumpers needed to be bridged before they could accept the I2S input.

Anyways, they seem to sound just fine and the software is mostly doing what it's supposed to be doing except for the loudness compensation that goes hard clipping on the master channel as soon as I enable it?
As I understand it it should be compensating upping the bass, but seeing that it does it by around 20dB which just clips everything I'm not sure if it does it correctly? Or should I compensate it by lowering the preamp by around the same amount? Looking at the loudness graph in that window it looks like it's supposed to lower the midrange/treble and not upping anything. Could the be clarified maybe? :)
Also what exactly is the reference SPL supposed to be calibrated against? Is this whatever SPL at 1kHz comes out from my speakers with the host volume set to max?
I've done some testing (without any actual SPL measuring) and no matter the reference SPL I cannot get it to have the FR to sound the same when I change the volume, instead I have to set it to 100dB and then lower the intensity to 30% to get it to sound more or less the same (a bit more upper bass muddy at lower volumes though) when I change the volume. Feels like this is the wrong way to do it? Though I guess if it works it works, I really do like having this which is one of the reasons why I want DSPi instead of my MiniDSP, but it would be nice to have it set up correctly instead of just guessing :)
View attachment 524354
Btw, the icon for the loudness compensation and the volume leveller seems to be flipped, so the loudness has a moon and leveler has just a normal speaker icon.
Would also be nice if we could somehow get the loudness compensation showing live in the filter response somehow.

Can we get a left/right channel linking option for at least the master EQ? I don't know how other people use the master, but I tend to do my final subjective curve there and that should be the same on both channels so linking would be nice.

The filters seem to have a comma showing no matter what, mostly cosmetic I guess but it shouldn't probably be like that. Would also be nice to be able to be in on field and then tab to the next one.
View attachment 524371

And lastly, when DSPiConsole is opened the window is quite small, filling just a small portion of my screen with everything cramped together in there. The loudness window does the same. Could these be at least twice as big, or at least have the size saved in a config somewhere? :)
View attachment 524372

Anyways, fun stuff to finally be able to play around with it myself and maybe contribute a bit for this awesome development :) Thank you Troy!
Could you tell me your system language? I suspect the commas may result from the fact that I haven't used the CultureInfo.InvariantCulture for numeric formatting. Some languages default to commas for decimal separation. I have implemented a patch and will roll it into the hotfix.
 
Thank you so much, I was starting to despair! ;) And I'm glad to know it will be possible!

Yes, regarding the separation of the PEQ and crossover, that's what's done elsewhere, so I completely understand. That being said, the current configuration in this respect doesn't bother me either. But obviously, those familiar with this kind of thing, like myself, will find it very familiar!
This has now been addressed. In the upcoming hotfix, you will have four decimal places of precision for delays and two for gains.

1776130015074.png


I have also added a "Set as Default" item to the Preset context menu. Setting this flag will configure the startup mode (accessible via Settings) to load the selected preset automatically on boot. If the active preset is already the default, this menu item will be greyed out.

1776130875947.png
 
Last edited:
Could you tell me your system language? I suspect the commas may result from the fact that I haven't used the CultureInfo.InvariantCulture for numeric formatting. Some languages default to commas for decimal separation. I have implemented a patch and will roll it into the hotfix.
My language is set to english but my localization stuff is set to swedish, and yeah we use commas for decimal separation. IF possible it would be nice if both commas and dots where supported though so one don't have to think about whichever one should use since many programs use either or and it's always difficult to remember. Buut this is nitpicking :)
 
@Weeb Labs holy cow you get a lot of posts here. I wish these things weren't so linear. To answer your questions:

1) I tried the output slots thing and nothing I could find saved the I2S through a reset. Is there an actual Save button somewhere I'm missing? I switch Presets then go to Settings and set I2S for slot 0 and pick the save preset options then close the settings box.

2) I'm running Windows 11 with a 12 core I7. For the Pico I'm using a Pimoroni PicoPlus2 with an RP2350A2. So this is interesting, as I run the test repeatedly the error keeps moving slightly to the left and cycles so it looks like a synchronization issue with the oscillators. Photos of a,b,c sweeps with the residual bump pretty obvious. I wish these folks would publish schematics. I'm currently running 96KHz/64K sample points so 2/3 second sweep.

1776165129961.png
1776165109536.png
1776165149910.png


3) I can test SPDIF output but not with that particular board, which is I2S input. I have another board without the oscillators but can't get the I2S working on it despite it otherwise looking identical. I'll try SPDIF with a retail DAC and play with board 2 also then come back and update this. I also have three vanilla I2S DAC boards coming this weekend that I'll test.

On the concept of helping - have you considered using Avalonia for the application? You (or I) could port it easily using the existing C# code with slight mods and it would work windows/mac/linux.

Thanks, Mark

Postscript: OK I tried with an Atom DAC+ being fed optical SPDIF though a coax->optical converter and it was flawless at 96KHz.
 
Last edited:
I just noticed a weird thing is that I (manually) copied every setting from my MiniDSP to both my main speakers and subwoofers, and that includes the different overall gains where my subs needs around -17dB compared to the mains, but when I set it to the same on the DSPi the subwoofers totally take over, so instead I needed to set it all the way down to -35dB to make it sound correctly.
Buut then I right clicked on a preset and pressed save and the subwoofers suddenly disappears. To make them come back again I had to up the gain to -8dB to match my mains again. Not sure what's going on here if it's DSPi doing something or if it's the I2S boards messing with me? I have changed and saved stuff after that but nothing new happens.

I also noticed that the GPIO pin assignment doesn't seem to be saved and kept when I plug out and in the Pico (choosing I2S and SPDIF does though) .
Enabling "Include Pin Assignments in Presets" doesn't seem to matter. For some reason I had opted for using pin 4, 5 and 6, so I solved it by swapping to the default 6, 7 and 8 instead. Still needs to be fixed though :)

A smaller thing I noticed is that the Master L and R inputs have the same colour as the first two outputs, gets a bit muddy in response curve window because of that. Unique colours for all inputs and outputs would be good. Also maybe make the outputs maybe dotted or thinner to make the master stand out (or vise versa?)? Perhaps an option for this?

Also got to make some small shout outs since I've compared this to the MiniDSP before.
I just noticed you can copy/paste filters between outputs, something that you can't really do on the MiniDSP, very handy!
And I got to say that I really liked having all the filters of a channel as a list instead hidden under each filters button as my MiniDSP does it. Would be nice with less spacing here though to be able to see more without resizing the window too much.
The very quick swapping between presets is also nice, instead of having to wait a few second for it to update. And the very responsive meters that also have clipping indicators, very nice.

Btw, do you prefer writing bugs and/or requests here or you prefer it on github? :)
 
@Weeb Labs holy cow you get a lot of posts here. I wish these things weren't so linear. To answer your questions:

1) I tried the output slots thing and nothing I could find saved the I2S through a reset. Is there an actual Save button somewhere I'm missing? I switch Presets then go to Settings and set I2S for slot 0 and pick the save preset options then close the settings box.

2) I'm running Windows 11 with a 12 core I7. For the Pico I'm using a Pimoroni PicoPlus2 with an RP2350A2. So this is interesting, as I run the test repeatedly the error keeps moving slightly to the left and cycles so it looks like a synchronization issue with the oscillators. Photos of a,b,c sweeps with the residual bump pretty obvious. I wish these folks would publish schematics. I'm currently running 96KHz/64K sample points so 2/3 second sweep.

View attachment 524710View attachment 524709View attachment 524711

3) I can test SPDIF output but not with that particular board, which is I2S input. I have another board without the oscillators but can't get the I2S working on it despite it otherwise looking identical. I'll try SPDIF with a retail DAC and play with board 2 also then come back and update this. I also have three vanilla I2S DAC boards coming this weekend that I'll test.

On the concept of helping - have you considered using Avalonia for the application? You (or I) could port it easily using the existing C# code with slight mods and it would work windows/mac/linux.

Thanks, Mark

Postscript: OK I tried with an Atom DAC+ being fed optical SPDIF though a coax->optical converter and it was flawless at 96KHz.
After setting your output assignments, you need to right-click the preset item in the sidebar and choose Save. Regarding the other board (without PLL?), you may need to enable and connect the master clock output.

I’m glad all is well with the SPDIF at 96KHz. Hopefully the I2S issue is just an oscillator beat frequency!

I have considered migrating to a cross platform framework like Qt or Avalonia. There is actually a local repo with a Rust core and Qt UI that I have been working. I might push that to GitHub. It works but a ensuring a native UI is quite important to me, so it’s quite a lot of per-platform fine tuning.

There is a Weeb Labs Discord that might be handy for more non-linear technical discussion.

I just noticed a weird thing is that I (manually) copied every setting from my MiniDSP to both my main speakers and subwoofers, and that includes the different overall gains where my subs needs around -17dB compared to the mains, but when I set it to the same on the DSPi the subwoofers totally take over, so instead I needed to set it all the way down to -35dB to make it sound correctly.
Buut then I right clicked on a preset and pressed save and the subwoofers suddenly disappears. To make them come back again I had to up the gain to -8dB to match my mains again. Not sure what's going on here if it's DSPi doing something or if it's the I2S boards messing with me? I have changed and saved stuff after that but nothing new happens.

I also noticed that the GPIO pin assignment doesn't seem to be saved and kept when I plug out and in the Pico (choosing I2S and SPDIF does though) .
Enabling "Include Pin Assignments in Presets" doesn't seem to matter. For some reason I had opted for using pin 4, 5 and 6, so I solved it by swapping to the default 6, 7 and 8 instead. Still needs to be fixed though :)

A smaller thing I noticed is that the Master L and R inputs have the same colour as the first two outputs, gets a bit muddy in response curve window because of that. Unique colours for all inputs and outputs would be good. Also maybe make the outputs maybe dotted or thinner to make the master stand out (or vise versa?)? Perhaps an option for this?

Also got to make some small shout outs since I've compared this to the MiniDSP before.
I just noticed you can copy/paste filters between outputs, something that you can't really do on the MiniDSP, very handy!
And I got to say that I really liked having all the filters of a channel as a list instead hidden under each filters button as my MiniDSP does it. Would be nice with less spacing here though to be able to see more without resizing the window too much.
The very quick swapping between presets is also nice, instead of having to wait a few second for it to update. And the very responsive meters that also have clipping indicators, very nice.

Btw, do you prefer writing bugs and/or requests here or you prefer it on github? :)
Thank you very much for the bug report! I am happy to
Take them here but GitHub issues do make things easier to track. I have a local LLM scraping this thread in an attempt to organize the reports but it can still be tricky to keep everything orderly. :)

I will investigate the output gain behavior shortly. It is most likely just a rounding issue in the application and should be straightforward to rectify.

After saving the preset, you might need to open the settings and ensure that the startup default is set to your present. The upcoming hotfix revises startup handling to make this more intuitive.

I’m glad you’re finding the copy/paste, meters and rapid switching to be helpful. I will be fine tuning spacing throughout the application soon, as I agree that it is excessive in places.
 
Back
Top Bottom