• 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 got a straight answer on that yet.

I suspect clocks getting out of sync may be an issue, smearing phase alignment.

Dumb interfaces have master/slave BNC word clock I/O

On a full host RPi, there are many "network clock" protocols available, like netjack2 and ROC toolkit on PipeWire, PTP/IEEE 1588 on Gstreamer

AES67 is another way I guess.

But the solution on Pico I dunno.

Or maybe this just is not a problem?
 
I have just released DSPi Firmware v1.1.4-beta3 and DSPi Console v1.1.4-beta3 for Windows. The macOS version will be updated shortly.

This release introduces some highly anticipated new functionality along with various quality of life enhancements. :)
  • Firmware: LG Sound Sync support when using SPDIF input
  • Firmware: External Mute Control for DACs, amplifiers and other devices to prevent potentially loud pops during system state changes
  • Firmware: Added 2nd order all-pass filter type
  • Console: Per-band bypass control
  • Console: Redesigned settings spanel
  • Console: PDM fixed on RP2040
Console has received many small enhancements in addition to the redesigned settings panel.

1779059494976.png


The volume slider in the sidebar now controls User Volume by default and is automatically synchronised when the host (Windows) volume slider changes. Please be aware that due to UAC1 limitations, this synchronisation is not bi-directional. This means adjustments made to the Windows volume slider will be reflected in the sidebar but not the other way around.

1779060218515.png
1779060235792.png


It can be switched to Master Volume via the dropdown menu. The UI should now also be noticeably snappier when loading presets.

1779059331793.png
1779059352869.png



As always, please don't hesitate to report any bugs that you encounter; that's how we squash them! You can do that either here, on GitHub or via Discord (many helpful people there). If you wish to support the project, you can also do that via Ko-fi.
 
Last edited:
Nice work, but could you please allow multiple SPDIF inputs with fixed (but obviously selectable) GPIO pins, rather than a single SPDIF input with a variable GPIO pin? (Basically, the same way as the SPDIF outputs.)

Also, when do you plan to implement the crossover filters that matter? (Butt, LR, Bessel...)
 
Are there any updates on this? Especially the Coax Input is still not clear, and that's what I want to finish on my board:
The SPDIF coax output is easy because you just need to reduce the voltage and AC-couple it (via capacitor or transformer). To do the opposite is not so easy.


RP2350 Input High = 2V Minimum (IOVDD @3.3V)
RP2350 "undefined behaviour zone" = 0.8V to 2V (input could be read randomly as high or low)
RP2350 Input Low = 0.8V Maximum (IOVDD @3.3V)

SPDIF Input level Minimum = 0.2V peak-peak (AC-coupled)
SPDIF Input level Maximum = 0.6V peak-peak (AC-coupled)

Even if you DC-couple the SPDIF input, in the best-case scenario you will only see a signal between 0V and 0.6V - i.e. not even leaving the RP2350 Low threshold. If you DC level-shift, the AC signal @ 0.6V it isn't enough to get out of the "forbidden zone" between 0.8V and 2v so the behaviour is "undefined"! If you're lucky, the output of the device you're connecting it to might have an out-of-spec output that is higher than 0.6V peak-peak, but that would just be luck. This is where the "but it works for me" confusion arises :)

If you want it to work properly and on any SPDIF spec output (i.e. most hifi equipment) then you need to amplify the signal - check out the second reference above, page 10 onwards. Fortunately you can get dual-inverters pretty cheaply, which will do fine for one input (or two if you're feeling lucky!):-

SPDIF_Input.png

Hope this helps, sorry if it's not as simple as you'd hoped!

Ajay
 
Two things:
@Ajay - yes, like an idiot, I built a level shifter using DC bias that worked fine... until there was no signal and it sat midpoint and started screaming out of my speakers. PTSD my dog. Never again. Switched to optical input.

@Weeb Labs I just ran the latest windows console (beta3) and it shows GPIO 5 as default SPDIF (??) and when I change the SPDIF pin it seems to work then crashes the app.
 
Nice work, but could you please allow multiple SPDIF inputs with fixed (but obviously selectable) GPIO pins, rather than a single SPDIF input with a variable GPIO pin? (Basically, the same way as the SPDIF outputs.)

Also, when do you plan to implement the crossover filters that matter? (Butt, LR, Bessel...)
The plan is to introduce crossover filters as a separate array applied after PEQ, with a separate section within the channel pages. This is a significant architectural change but it is being worked on.

Multiple SPDIF input assignments is planned for the next beta.
 
Multiple SPDIF input assignments is planned for the next beta.
Would these multiple SPDIF inputs eventually become multiple I2S inputs? There are some HDMI to 4x I2S (one set of clocks, multiple data lines) cards floating around in AliExpress and this could essentially replace something like a MiniDSP FlexHT. Or am I asking too much out of a poor Raspberry?
 
Would these multiple SPDIF inputs eventually become multiple I2S inputs? There are some HDMI to 4x I2S (one set of clocks, multiple data lines) cards floating around in AliExpress and this could essentially replace something like a MiniDSP FlexHT. Or am I asking too much out of a poor Raspberry?
Multiple SPDIF inputs will be switched rather than simultaneous, as they would each represent a different clock domain. Multiple simultaneous I2S inputs are planned. These are much easier to implement, as all four data inputs share the same clock domain, which enables us to servo the outputs from them.
 
Would these multiple SPDIF inputs eventually become multiple I2S inputs? There are some HDMI to 4x I2S (one set of clocks, multiple data lines) cards floating around in AliExpress and this could essentially replace something like a MiniDSP FlexHT. Or am I asking too much out of a poor Raspberry?
for info, you can already do that with a raspberry pi 5. See here (i know, i know, it is 25 pages....

 
@Weeb Labs I just ran the latest windows console (beta3) and it shows GPIO 5 as default SPDIF (??) and when I change the SPDIF pin it seems to work then crashes the app.
Thank you for the report. This is a bug that I had previously squashed for the I2S configuration page but overlooked for the SPDIF input page. I will push a hotfix this evening.

Regarding the default SPDIF RX pin change, this was to avoid a collision with the default external mute pin. I thought it would make more sense to place mute directly after I2S data output rather than SPDIF input. You are of course free to set any desired assignment!

For those interested, upcoming crossover filters are LR2-LR8, BW1-BW4 and BSL2-BSL4. These should meet the vast majority of needs.
 
Two things:
@Ajay - yes, like an idiot, I built a level shifter using DC bias that worked fine... until there was no signal and it sat midpoint and started screaming out of my speakers. PTSD my dog. Never again. Switched to optical input.
Guess I'll have to make room for a Toslink receiver the... Thanks for clarifying!
 
For coaxial SPDIF input, the appropriate solution is a Schmitt trigger such as the SN74HC14N or other hex inverter.
 
Last edited:
For those interested, upcoming crossover filters are LR2-LR8, BW1-BW4 and BSL2-BSL4. These should meet the vast majority of needs.
Will this reduce the impact on the DSP load? Right now I use 3 2nd order filters to implement LR6, which leaves only 4 filters for equalization on the midrange with 6th order high- and lowpass.

This is the reason I asked earlier if the idea to get rid of the 10 filter per channel limit and instead limiting the total number of filters is still on the roadmap. I don't mind creating my higher order filters by cascading first and second order filters as long as i don't run out of filter bandwidth. This is often beneficial when shaping the natural slopes of drivers to match a specific filter characteristic.
 
Will this reduce the impact on the DSP load? Right now I use 3 2nd order filters to implement LR6, which leaves only 4 filters for equalization on the midrange with 6th order high- and lowpass.

This is the reason I asked earlier if the idea to get rid of the 10 filter per channel limit and instead limiting the total number of filters is still on the roadmap. I don't mind creating my higher order filters by cascading first and second order filters as long as i don't run out of filter bandwidth. This is often beneficial when shaping the natural slopes of drivers to match a specific filter characteristic.
The upcoming crossover filters will be part of a dedicated block with its own per-channel limit. Higher order filters with multiple sections will be counted and represented as just one band.

This should address the restrictive 10-band limit until it is made flexible.
 
Two things:
@Ajay - yes, like an idiot, I built a level shifter using DC bias that worked fine... until there was no signal and it sat midpoint and started screaming out of my speakers. PTSD my dog. Never again. Switched to optical input.

@Weeb Labs I just ran the latest windows console (beta3) and it shows GPIO 5 as default SPDIF (??) and when I change the SPDIF pin it seems to work then crashes the app.
This has now been corrected in a hotfix release. :)
 
For coaxial SPDIF input, the appropriate solution is a Schmitt trigger such as the SN74HC14N or other hex inverter.
That may work under some circumstances, but it's not the best solution. According to the Ti datasheet when run at 2V:

SN74HC14N ΔVT Hysteresis = MIN 0.2V -> TYPICAL 0.6V -> MAX 1.2V
SPDIF Signal Specification = MIN 0.2V -> MAX 0.6V (AC Peak-peak)

For some reason the datasheet doesn't give the spec at 3.3V, but the figures are guaranteed to be worse i.e. further apart - and the typical SN74HC14N with 2V supply is right on the edge of the SPDIF spec. So it might work, but might give all sorts of reliability issues. One solution that meets the SPDIF specification is to use unbuffered inverters configured for analogue gain, other options are LVDS receivers or fast comparators. See the attached AN5073 - it's a good read, page 10 onwards for the circuits.

I've attached the ST application note as the link in my previous post doesn't work. Sorry I keep banging on about this, but it's worth doing something to spec (especially if it's no more expensive) because you know it will work years in the future when you upgrade source equipment. Also, people will be copying you, safe in the knowledge that these solutions work, but if they have a weaker signal or a long cable it could cause no end of grief....

As you were! :D

Ajay
P.S. Also, beware of random internet schematics, projects where "it works for me" and even commercial products that should know better.......
 

Attachments

Hey Troy!
This is so cool that after years of just reading this forum I had to sign up! I've made a sub bass EQ/XO with RP2040 and ADAU1701 previously and I just couldn't believe that the same microprocessor that I used just for running monochrome UI on a 1" OLED and calculating coefficients for ADAU1701 can actually run the whole damn thing! Well done sir! Naturally I fired up one my RP2040's and wired things up (PCM5102A DAC) and flashed the firmware and it just works. Windows console is really functional too. One thing that I noticed that setting up filters and/or EQ doesn't allow anything below 20Hz. Now I did notice that there's an export function for the filters so I naturally modified couple of filters so that Fc is below 20Hz and imported it. To my surprise the UI actually showed values below 20Hz and the graph rendered correctly. A bug or deliberate design choice? Now I didn't measure whether the filter actually changed or not. Will have to have another go with it after my evening tea :D I tried to read the whole thread as well as I could but I'm still a bit confused if I can actually have an external ADC (like the cheapo Aliexpress one on my hand) using I2S? Bonus picture has my RP2040 + ADAU1701 size comparison.

EDIT: I measured the sub-20Hz filters and they do indeed work!
 

Attachments

  • IMG_1437.JPEG
    IMG_1437.JPEG
    557.3 KB · Views: 106
  • IMG_1438.JPEG
    IMG_1438.JPEG
    174 KB · Views: 109
  • IMG_1439.JPEG
    IMG_1439.JPEG
    534.6 KB · Views: 118
Last edited:
Nice work, but could you please allow multiple SPDIF inputs with fixed (but obviously selectable) GPIO pins, rather than a single SPDIF input with a variable GPIO pin? (Basically, the same way as the SPDIF outputs.)

Also, when do you plan to implement the crossover filters that matter? (Butt, LR, Bessel...)
Do you think these might cover most of the bases? :D

1779214382192.png


Hey Troy!
This is so cool that after years of just reading this forum I had to sign up! I've made a sub bass EQ/XO with RP2040 and ADAU1701 previously and I just couldn't believe that the same microprocessor that I used just for running monochrome UI on a 1" OLED and calculating coefficients for ADAU1701 can actually run the whole damn thing! Well done sir! Naturally I fired up one my RP2040's and wired things up (PCM5102A DAC) and flashed the firmware and it just works. Windows console is really functional too. One thing that I noticed that setting up filters and/or EQ doesn't allow anything below 20Hz. Now I did notice that there's an export function for the filters so I naturally modified couple of filters so that Fc is below 20Hz and imported it. To my surprise the UI actually showed values below 20Hz and the graph rendered correctly. A bug or deliberate design choice? Now I didn't measure whether the filter actually changed or not. Will have to have another go with it after my evening tea :D I tried to read the whole thread as well as I could but I'm still a bit confused if I can actually have an external ADC (like the cheapo Aliexpress one on my hand) using I2S? Bonus picture has my RP2040 + ADAU1701 size comparison.

EDIT: I measured the sub-20Hz filters and they do indeed work!
Hello and thank you for the kind words! The 20Hz filter lower limit is just a UI quirk that I will be patching for the next beta release. The firmware will parse filters down to 10Hz.

Regarding I2S input, this is not yet supported but will be added very soon.
 
Hi Troy,
Concerning the SPDIF input, I've noticed that when the toslink receiver is attached to the RP2040, the volume level (both visually on the input VU meters and audio-wise) is almost 6dB lower than when using the same receiver with the RP2350. Both Pico boards are running on factory default settings.
 
Back
Top Bottom