• 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

SPDIF input will most likely default to GPIO 5.

I2S output is now functional, complete with live output type and pin assignment. As always for brand new functionality, this UI is absolutely not final. It is just functional enough for me to test each component to destruction. :)

Any output slot can now be assigned either to SPDIF or I2S. Master clock output is available in 128 x Fs and 256 x Fs formats through a dedicated state machine, with the former being jitter-free at 48KHz.

View attachment 519912View attachment 519915
The same buffer configuration is used for both SPDIF and I2S output, so we can get away with a single feedback servo. I am loading the I2S and SPDIF PIO programs into the same four state machines, with teardown and reconstruction logic to ensure a clean state following each change. All output buffer fills are kept perfectly synchronized.
Ooh great timing! Just got my Pico 2w and I2S boards in the mail. Well too bad I'm running Windows so I guess I'll still have to wait a while. But in the meantime I can design a simple case for it for 3D printing.
 
I made some measurements of the PDM sub output. I expected a lot of power supply noise on the output, I have some ideas on how to improve it, but I ended up going down a rabbit hole in a different direction. The measurement set up is a DIY analyzer/sound card with a passive 5th order Low pass RLC filter with a input Impedance of about 3k + the capacitance of 1M of shielded cable. The filter on the pico is 3.3k / 47nf when loaded with the analyzer fc is about 2k and there is 6dB loss. Fullscale at clipping with the filter on the following charts is about -20dBFS.
The noise floor of the test setup with inputs shorted:
index.php
Power Supply Noise of the Pico 3.3 volt rail. There are no filters running, it might be worse with lots of filters.This wasn't as bad as I was expecting.
ps noise.png


A distortion measurement directly on the pico pin, without the RC Filter didn't look fantastic.

Distortion 100Hz, no filter, std drive.png


With the RC filter it is much better.

Distortion 100Hz, filter, std drive.png

The problem is the Pico pin can't drive the cable capacitance of the analyzer. The output pulses are quite triangular on a scope. Even without the cable capacitance, just the RC filter attached the rise time of the pulses could be better. I recompiled DSPi with a mod to set 12mA drive and High Slew rate on the PDM pin.
The no filter case is much better:
Distortion 100Hz, High Drive.png

With the RC filter the change is less dramatic, it's a bit hard to tell as the distortion figures jump around a bit but it seems to be a bit better.

Distortion, 100Hz, Filter, High Drive, Best.png

And a measurement at 1kHz, pretty good.
Distortion 1kHz, filter, high drive.png

Looking at the spectrum with no signal or the Sub output muted there is a idle tone at 93.75 Hz which is 48000/512. It's 55dB down from the max output level but the frequency is unfortunately bad for a sub output. It might be audible in some setups. The idle tone disappears when a signal is applied. But shows up as a increased noise floor for signals around 93 Hz.
sub noise.png



In the sweep below the brown trace is the noise floor, black is THD.

Sub Sweep with  No DC Offset.png




A quick fix is to add a small DC offset at the input to the PDM modulator, subtracting 32 from the target value moves the idle tone up out of band for a subwoofer and the amplitude is less. Distortion seems unaffected.

Idle Tone DC offset -0x20-0x10000.png


Sub Sweep with DC Offset -32.png
 

Attachments

  • grounded reference.png
    grounded reference.png
    153.3 KB · Views: 1,146
After several days away from this I'm now running 1.1.2b.

Is the side panel now translucent? I don't recall having bleed through from a window behind the console on earlier versions.

I've also noticed that if I open one of the optional windows (e.g., Crossfeed or Loudness) and then click elsewhere in the console to minimize that window, it leaves a "shadow" behind on the side panel.

1774360372164.png

^ my avatar on ASR slightly showing through. The screen grab seems to diminish the affect somewhat.
1774360524775.png

^ Shadow from minimized Crossfeed window.

Obviously just minor cosmetic things but wanted to point them out.
 
I made some measurements of the PDM sub output. I expected a lot of power supply noise on the output, I have some ideas on how to improve it, but I ended up going down a rabbit hole in a different direction. The measurement set up is a DIY analyzer/sound card with a passive 5th order Low pass RLC filter with a input Impedance of about 3k + the capacitance of 1M of shielded cable. The filter on the pico is 3.3k / 47nf when loaded with the analyzer fc is about 2k and there is 6dB loss. Fullscale at clipping with the filter on the following charts is about -20dBFS.
The noise floor of the test setup with inputs shorted:
index.php
Power Supply Noise of the Pico 3.3 volt rail. There are no filters running, it might be worse with lots of filters.This wasn't as bad as I was expecting.
View attachment 519952

A distortion measurement directly on the pico pin, without the RC Filter didn't look fantastic.

View attachment 519953

With the RC filter it is much better.

View attachment 519954
The problem is the Pico pin can't drive the cable capacitance of the analyzer. The output pulses are quite triangular on a scope. Even without the cable capacitance, just the RC filter attached the rise time of the pulses could be better. I recompiled DSPi with a mod to set 12mA drive and High Slew rate on the PDM pin.
The no filter case is much better:
View attachment 519957
With the RC filter the change is less dramatic, it's a bit hard to tell as the distortion figures jump around a bit but it seems to be a bit better.

View attachment 519960
And a measurement at 1kHz, pretty good.
View attachment 519961
Looking at the spectrum with no signal or the Sub output muted there is a idle tone at 93.75 Hz which is 48000/512. It's 55dB down from the max output level but the frequency is unfortunately bad for a sub output. It might be audible in some setups. The idle tone disappears when a signal is applied. But shows up as a increased noise floor for signals around 93 Hz.
View attachment 519964


In the sweep below the brown trace is the noise floor, black is THD.

View attachment 519962



A quick fix is to add a small DC offset at the input to the PDM modulator, subtracting 32 from the target value moves the idle tone up out of band for a subwoofer and the amplitude is less. Distortion seems unaffected.

View attachment 519965

View attachment 519966
I couldn’t eliminate the hum on the PDM output going into my BK sub. My Dali sub handled it slightly better, but the noise was still audible. I kept refining the filter circuit and managed to reduce it somewhat, but it was never fully resolved.
In the end, I decided to abandon the PDM output and switch to a cheap DAC board with SPDIF input instead. Now that I²S support is coming, I’ll be using a small I²S DAC to avoid powering multiple devices, it should be more than adequate for a clean sub output. And also frees up future channels.
 

Attachments

  • Screenshot_20260324_151556_Amazon Shopping.jpg
    Screenshot_20260324_151556_Amazon Shopping.jpg
    134.6 KB · Views: 88
I couldn’t eliminate the hum on the PDM output going into my BK sub. My Dali sub handled it slightly better, but the noise was still audible. I kept refining the filter circuit and managed to reduce it somewhat, but it was never fully resolved.
In the end, I decided to abandon the PDM output and switch to a cheap DAC board with SPDIF input instead. Now that I²S support is coming, I’ll be using a small I²S DAC to avoid powering multiple devices, it should be more than adequate for a clean sub output. And also frees up future channels.
The PDM output isn't going to be as good as a cheap DAC board. It's still a useful part of DSPi though. If you come across the project and have a spare pico it enables you to try it out right now, instead of having to order a board, wait and possibly lose interest in the mean time.
 
if anyone is looking for a good dac board khadas tone 2 maker kit is a good one, with both i2s and spdif inputs and only 5v power requirements (usb rail is suitable). i use two of them in my biamping setup
 
I installed the firmware now, was really easy which was very nice compared to what I'm used to when working with Raspberries, jailbreaking iPhones, rooting Androids and similar stuff I've done in the past.
Haven't been able to play anything through it though since I'm still waiting for the I2S outputs, but I've played around a bit with the software at least (had to use that Zadiq software btw) and so far it feels and looks really nice, and I also like that the sound meters are so much more responsive than what the MiniDSP is and we also got clipping indicators.
I do have a few thoughts though :)

Having the different bands shown as points on the graph would be really helpful. These could also be moved and dragged around to easily change the frequency and gain of them, and also while dragging you can hold ctrl to change the Q. This is how Abletons PEQ works and it's really fast and easy to work with a PEQ and is something I've missed on my MiniDSP so I'm hoping you could implement it!

I did a few comments about this mouse wheel scrolling action a few pages back but didn't get any reaction about that so I'll try again :)
As it is now it doesn't work particularly well, the steps are not good and the accelerated scrolling feels very flimsy and uncontrolled so it should be disabled altogether imo.
So when scrolling over the frequency on PEQ bands it should be dynamic, so changing by 1Hz steps in the lower bass for each scroll, by maybe 500Hz in the upper treble, and a gradient of that inbetween. Ie it should be logarithmic just like the frequency scale, this is also how most other softwares does it like MiniDSP and Ableton and it works really well.
And when holding ctrl (or any button of your choosing) the steps should be maybe 5x larger for faster and better control.
The Q value scrolling of 0.01 feels too low, 0.1 would be better imo. And the same goes for the decibel, 0.01dB is so far below any audibility threshold that I don't see the point of it at all. 0.5dB is what I'd go for, or maaybe 0.2dB. And if you hold ctrl when scrolling it can change in 1dB or even 2dB steps?
And then the delay steps is 1ms per scroll right now, should be closer to 0.1ms imo. Also have an option to easily change to distance, maybe ctrl-click on it. This and the other ctrl-stuff could shown as a tooltip when mouse over maybe?
And then there are some values like the preamp or loudness compensation that doesn't react to mouse scrolling at all, would be nice to have that in as well. And maybe add so you can scroll over the sliders as well?

Renaming the presets would also be nice!

This is all I got for now, just some stuff to improve this already amazing project even more!
 
If you come across the project and have a spare pico it enables you to try it out right now, instead of having to order a board, wait and possibly lose interest in the mean time.

yes it is still very usefull even with separate DAC board , for quick prototyping and debugging purposes
 
I did a few comments about this mouse wheel scrolling action a few pages back but didn't get any reaction about that so I'll try again :)
As it is now it doesn't work particularly well, the steps are not good and the accelerated scrolling feels very flimsy and uncontrolled so it should be disabled altogether imo.
So when scrolling over the frequency on PEQ bands it should be dynamic, so changing by 1Hz steps in the lower bass for each scroll, by maybe 500Hz in the upper treble, and a gradient of that inbetween. Ie it should be logarithmic just like the frequency scale, this is also how most other softwares does it like MiniDSP and Ableton and it works really well.
And when holding ctrl (or any button of your choosing) the steps should be maybe 5x larger for faster and better control.
The Q value scrolling of 0.01 feels too low, 0.1 would be better imo. And the same goes for the decibel, 0.01dB is so far below any audibility threshold that I don't see the point of it at all. 0.5dB is what I'd go for, or maaybe 0.2dB. And if you hold ctrl when scrolling it can change in 1dB or even 2dB steps?
And then the delay steps is 1ms per scroll right now, should be closer to 0.1ms imo. Also have an option to easily change to distance, maybe ctrl-click on it. This and the other ctrl-stuff could shown as a tooltip when mouse over maybe?
Sorry, but all of this works perfectly for me. If you scroll slowly with the mouse, the increments are small, and if you scroll quickly, the increments are larger. You can always enter the exact value using a keyboard.
Having the different bands shown as points on the graph would be really helpful. These could also be moved and dragged around to easily change the frequency and gain of them, and also while dragging you can hold ctrl to change the Q. This is how Abletons PEQ works and it's really fast and easy to work with a PEQ and is something I've missed on my MiniDSP so I'm hoping you could implement it!

I understand that old habits die hard. But not everything revolves around Ableton! My references in this field would be more like REW or VituixCad... not Cakewalk, Ableton, Cubase or Ardour... that has nothing to do with the objective here... and while they can be a source of inspiration, I don't find it relevant here.

However, for PEQs, once again, it would be possible to take inspiration from minidsp... (but indeed the same thing exists in DAWs):
PEQ1.jpg

PEQ2.jpg

But while it has the merit of being nice, pretty and fun, it's not necessarily precise (at least for a DSP)...
And this can only be done on the inputs, not the outputs (on the miniDSP).

Also note that they differentiate the crossover section from the output PEQ... but on this point I'm not categorical; I understand that mixing PEQ and crossover doesn't seem meaningless at the output. Although it has a "logical order," with PEQ you linearize the frequency response of the speakers, then you apply the crossover....
 
Last edited:
I installed the firmware now, was really easy which was very nice compared to what I'm used to when working with Raspberries, jailbreaking iPhones, rooting Androids and similar stuff I've done in the past.
Haven't been able to play anything through it though since I'm still waiting for the I2S outputs, but I've played around a bit with the software at least (had to use that Zadiq software btw) and so far it feels and looks really nice, and I also like that the sound meters are so much more responsive than what the MiniDSP is and we also got clipping indicators.
I do have a few thoughts though :)

Having the different bands shown as points on the graph would be really helpful. These could also be moved and dragged around to easily change the frequency and gain of them, and also while dragging you can hold ctrl to change the Q. This is how Abletons PEQ works and it's really fast and easy to work with a PEQ and is something I've missed on my MiniDSP so I'm hoping you could implement it!

I did a few comments about this mouse wheel scrolling action a few pages back but didn't get any reaction about that so I'll try again :)
As it is now it doesn't work particularly well, the steps are not good and the accelerated scrolling feels very flimsy and uncontrolled so it should be disabled altogether imo.
So when scrolling over the frequency on PEQ bands it should be dynamic, so changing by 1Hz steps in the lower bass for each scroll, by maybe 500Hz in the upper treble, and a gradient of that inbetween. Ie it should be logarithmic just like the frequency scale, this is also how most other softwares does it like MiniDSP and Ableton and it works really well.
And when holding ctrl (or any button of your choosing) the steps should be maybe 5x larger for faster and better control.
The Q value scrolling of 0.01 feels too low, 0.1 would be better imo. And the same goes for the decibel, 0.01dB is so far below any audibility threshold that I don't see the point of it at all. 0.5dB is what I'd go for, or maaybe 0.2dB. And if you hold ctrl when scrolling it can change in 1dB or even 2dB steps?
And then the delay steps is 1ms per scroll right now, should be closer to 0.1ms imo. Also have an option to easily change to distance, maybe ctrl-click on it. This and the other ctrl-stuff could shown as a tooltip when mouse over maybe?
And then there are some values like the preamp or loudness compensation that doesn't react to mouse scrolling at all, would be nice to have that in as well. And maybe add so you can scroll over the sliders as well?

Renaming the presets would also be nice!

This is all I got for now, just some stuff to improve this already amazing project even more!
Thank you very much for the input!

I love the logarithmic frequency scrolling idea and will experiment with it. If it works well in practice, I might make it an option. Some of the values don't respond to scroll events but that will soon be fixed.

The delay distance is another great idea and I will definitely be implementing it.

Displaying filter positions on the chart is an interesting idea which I might make toggleable.

Regarding presets, you can right-click the current preset to save, rename, clear it or clear all. Names are device persistent. :)
 
The Q value scrolling of 0.01 feels too low, 0.1 would be better imo. And the same goes for the decibel, 0.01dB is so far below any audibility threshold that I don't see the point of it at all. 0.5dB is what I'd go for, or maaybe 0.2dB. And if you hold ctrl when scrolling it can change in 1dB or even 2dB steps?
While everything else is a matter of taste, on this specific point I completely disagree. These settings, down to the hundredth point, are crucial in the design of active filters. It might seem trivial at first glance, but when you're used to this kind of thing, it's far from insignificant.


But I agree with that :
And then the delay steps is 1ms per scroll right now, should be closer to 0.1ms imo. Also have an option to easily change to distance, maybe ctrl-click on it. This and the other ctrl-stuff could shown as a tooltip when mouse over maybe?
And then there are some values like the preamp or loudness compensation that doesn't react to mouse scrolling at all, would be nice to have that in as well. And maybe add so you can scroll over the sliders as well?

Basically, the more precision you have, the better it is in Q, frequencies, decibels, delay, gain... in short, if possible, more is better than less.
 
Last edited:
Sorry, but all of this works perfectly for me. If you scroll slowly with the mouse, the increments are small, and if you scroll quickly, the increments are larger. You can always enter the exact value using a keyboard.


I understand that old habits die hard. But not everything revolves around Ableton! My references in this field would be more like REW or VituixCad... not Cakewalk, Ableton, Cubase or Ardour... that has nothing to do with the objective here... and while they can be a source of inspiration, I don't find it relevant here.
I find the accelerated scrolling very unreliable and uncontrolled, but if you like it then I won't object from it still being there as long as there is an option for it :)

But I don't see why Ableton would be a good referens? It's been around for almost 30 years and does many things really well. But sure, speaking of REW it also have a logarithmic scrolling feature just like I ask for, changing in increments of 1Hz down at 20Hz, while at 20kHz it changes in 200Hz steps. This could of course be used together with accelerated scrolling. Though fyi REW does not have accelerated scrolling, but it do have the feature where you hold alt when scrolling to change in increments of 1Hz no matter where you are in the frequency range. Not that I understand why since in the upper range it doesn't really matter at all if you've go for 19555Hz or 19573Hz for whatever you're doing.

While everything else is a matter of taste, on this specific point I completely disagree. These settings, down to the hundredth point, are crucial in the design of active filters. It might seem trivial at first glance, but when you're used to this kind of thing, it's far from insignificant.


But I agree with that :


Basically, the more precision you have, the better it is in Q, frequencies, decibels, delay, gain... in short, if possible, more is better than less.
I don't see any place where it would be useful to change in 0.01dB steps, it really is so far away from audibility that it could just as well not exist (but I'm open to hearing any actual usages where it's actually needed). But sure, I could go for 0.5dB steps when just scrolling, 2dB steps when ctrl-scrolling and 0.1dB when shift-scrolling ;)

Anyways, Troy got my request, so it's up to him to do whatever he feels like :)
 
My audio drops out a few times a day while listening all day. Its sounds like DSPi disconnects and reconnects quickly. I'm streaming from Qobuz with windows 11 pro.
Anyone else experiencing this?
Could be something unrelated to DSPi.
 
I find the accelerated scrolling very unreliable and uncontrolled, but if you like it then I won't object from it still being there as long as there is an option for it :)

But I don't see why Ableton would be a good referens? It's been around for almost 30 years and does many things really well. But sure, speaking of REW it also have a logarithmic scrolling feature just like I ask for, changing in increments of 1Hz down at 20Hz, while at 20kHz it changes in 200Hz steps. This could of course be used together with accelerated scrolling. Though fyi REW does not have accelerated scrolling, but it do have the feature where you hold alt when scrolling to change in increments of 1Hz no matter where you are in the frequency range. Not that I understand why since in the upper range it doesn't really matter at all if you've go for 19555Hz or 19573Hz for whatever you're doing.


I don't see any place where it would be useful to change in 0.01dB steps, it really is so far away from audibility that it could just as well not exist (but I'm open to hearing any actual usages where it's actually needed). But sure, I could go for 0.5dB steps when just scrolling, 2dB steps when ctrl-scrolling and 0.1dB when shift-scrolling ;)

Anyways, Troy got my request, so it's up to him to do whatever he feels like :)
Yes, sorry, I changed antihistamine molecules and I should probably be a little delirious when I read your posts and replied to them... because well, I said a bit of nonsense! In short, these things happen...:facepalm:haha:)
 
My audio drops out a few times a day while listening all day. Its sounds like DSPi disconnects and reconnects quickly. I'm streaming from Qobuz with windows 11 pro.
Anyone else experiencing this?
Could be something unrelated to DSPi.
Have you tried this firmware ?
Alternatively, you can disable the selective power-off of USB ports in Windows 11 settings.
 
Last edited:
My audio drops out a few times a day while listening all day. Its sounds like DSPi disconnects and reconnects quickly. I'm streaming from Qobuz with windows 11 pro.
Anyone else experiencing this?
Could be something unrelated to DSPi.
Yesterday was my first day of all day use of the latest Windows build. I had one occurrence of a dropout.
 
I have noticed these dropouts as well but had dismissed it as a host issue, as I had run into something similar with other devices. For the same issue to occur on three different systems seems very unlikely unless it is a firmware bug.

I am going to stash the I2S implementation to its own branch temporarily and implement a comprehensive logging system this evening so that we can get a clear look at exactly what is happening at any given moment. It is crucial that we have perfectly stable audio playback before the upcoming output type overhaul is merged.
 
I am going to stash the I2S implementation to its own branch temporarily and implement a comprehensive logging system this evening so that we can get a clear look at exactly what is happening at any given moment. It is crucial that we have perfectly stable audio playback before the upcoming output type overhaul is merged.

Thanks. Branch name so we can test it ? Seems that most dropouts are from Windows users.
 
As I suggested previously, check in the advanced settings related to Windows power management to ensure that the USB selective suspend setting is disabled!

This is a well-documented issue. When USB selective suspend is enabled, it often causes the kind of problem you're experiencing (random dropouts of DACs/external sound cards, hard drives, etc., even during use), and this has been the case since at least Windows 7.

Personally, I disable it, among other things, whenever I do a clean install of Windows (and I also check that it remains disabled after updates, as they unfortunately sometimes re-enable this option). Also, I've only done short testing sessions with the DSPi and therefore haven't encountered any problems of this kind.

In any case, if you already had this option disabled when you experienced the dropout, please specify this. This will at least help rule out the possibility that "USB selective suspend" is the cause of the problem.

If this option was enabled, disable it and tell us if it happens again or not.
 
Last edited:
Thanks. Branch name so we can test it ? Seems that most dropouts are from Windows users.
Here is the experimental branch incorporating live output type switching between I2S and SPDIF, with optional master clock output. I would regard this as alpha-stage but functional, so unexpected behaviors may exist.
 
Back
Top Bottom