Over the years, no doubt many computer audio users have heard or perhaps tried using HQPlayer Desktop from Signalyst for music playback. While there is a GUI for playback as well as a sophisticated network transport architecture, it's the upsampling and PCM-to-DSD features that are the program's claim to fame. There has been a good amount of talk about the sound quality of the upsampling algorithms and some swear by the sonic differences the program makes.
While admittedly I don't follow HQPlayer chatter closely, I don't recall reading about specific settings and what they do other than opinions about the sound quality. In this way, HQPlayer has been a bit of a mystery and I know some folks have had difficulty getting it running over the years. It has certainly been on my list of items to look into. In fact, back in early 2017 when I wrote about Roon 1.2, I mentioned installing HQPlayer but never got around to actually writing about it.
Well, after all these years, and now with the requisite pieces of hardware at my disposal for a more thorough evaluation (reasonably fast CPU/GPU system, ADC capable of >192kHz, DAC capable of DSD512), it's time to have a peek "under the hood" at what it does...
The tests today are done with a recent version of HQPlayer - 3.25.2 available as a demo (I see that there is now a 3.25.3 build available at the time of publication). The demo will run for 30 days, but 30 minutes at a time - enough time to try out, listen and run samples through the audio analyzer to get an idea of what it's doing. For the tests today here is the general hardware set-up:
Intel i7-3770K CPU + nVidia GTX 1080 GPU Windows 10 computer --> 16' generic USB --> Oppo UDP-205 as DAC --> generic 6' XLR --> RME ADI-2 Pro FS ADC --> generic USB --> Win 10 i5 measurement laptopNotice the setup is the same as the recent Oppo UDP-205 DSD playback post - using my Intel i7-3770K computer at stock 3.5GHz base speed up to 3.9GHz Turbo, 16GB DDR3 RAM Windows 10 PC. Remember I used various off-line PCM-to-DSD conversion tools and realtime JRiver 24 in that previous post, so feel free to compare.
HQPlayer is processing-hungry and I included the nVidia GTX 1080 GPU above since this is significant as HQPlayer allows one to offload much of the DSD conversion to the GPU which I activated for these tests. Remember, as discussed, there's no need to worry about "noise" with GPU and CPU's many feet away from my DAC. To give you an idea of processing demands, when doing realtime PCM-to-DSD conversion, this is what the CPU/GPU utilization looks like:
This is the "Performance" tab in Windows 10 Task Manager when playing back 24/96 PCM as DSD512 using "poly-sinc" oversampling and the "AMSDM7 512" modulator. As you can see, about 32% of the CPU and 25% of the GPU were utilized. This is rather in contrast to the much less processor-hungry JRiver 24 which only used 15-25% of the CPU without GPU assistance!
Because HQPlayer has so many different settings, it makes it difficult and time-consuming to check out all the combinations possible (but I'll try to get a good taste of what it does nonetheless). The "Settings" tab looks like this:
|HQPlayer settings. Doesn't look very nice with Windows scaling but text made easier to read.|
And for DSD realtime playback, the key parameters are on the right lower part under "SDM Defaults" to select which "Oversampling" algorithm you want to use and below that the "Modulator" used to convert PCM to DSD/SDM. Of course, you can then specify the "Bit rate" which in this example is "44.1k x512" - also known as DSD512 or 1-bit 22.6MHz. In HQPlayer one has the choice of using either 44.1 or 48kHz "base" and the usual multiples like 64/128/256/512/1024 and a few other atypical choices (like 32kHz base frequency). Depending on your DAC, not all these options would be meaningful or applicable.
I. Digital Filter OptionsThe "Oversampling" setting allows you to try various upsampling filters. You have a ton of options both for PCM and DSD:
Rather overwhelming. Let's just jump in and look at the impulse responses for some of the options one could choose in that list above:
I think that's a decent survey of 8 of them. As you can see, these are variations of orthodox linear and minimum phase filtering (I use the word "orthodox" as a good thing here!). Some are longer/sharper filters than others. As usual, one could show the frequency domain performance to check for noise and ultrasonic distortions. Here is what the "poly-sinc", "poly-sinc-xtr-2s", "sinc-M" (one million taps), and "poly-sinc-mqa-mp" resamplers look like when upsampling from 44.1kHz with "Vol Max" at 0dB. I've presented the graphs in the Juergen Reis-inspired "digital filter composite" (DFC) I've been using here over the years (click on image to enlarge):
Those are very clean filters. Since I'm interested in resampler performance rather than the DSD modulator at this point, the above were performed in PCM upsampling a 44.1kHz signal to 192kHz for the most part. The only exception is the "poly-sinc-xtr-2s" setting where you can see that it was converted to DSD512; this is one of the resampler settings only available when doing DSD conversion. Notice that the noise floor in the audible spectrum is higher with DSD than PCM which is consistent with previous measurements of the Oppo among others and which we'll talk more about a little later. Of note, "sinc-M" which is a Chord-like "megatap" filter is a strong brick wall, and the "poly-sinc-mqa-mp" setting allows a slightly more gentle roll-off while maintaining very good ultrasonic suppression (used to filter out high frequency noise added by MQA encoding).
The fact that "Vol Max" was set to 0dB and I played the signals back at full volume suggests to me that HQPlayer does a great job of preventing intersample overloading without any extra volume attenuation.
For comparison with other software upsampling:
The top row consists of JRiver 24 graphs with and without using the SoX resampling option. Notice the presence of intersample overloading with the 0dBFS wideband noise. This is despite "Clip Protection" being on in DSP Studio. Not much difference in JRiver whether SoX used or not.
In the bottom row are my piCorePlayer "Goldilocks" and "Extremus" settings discussed previously, showing that we can "roll our own" resampling and achieve some great results with a Raspberry Pi 3 and free software. Remember that the piCorePlayer resampling suggestions were for intermediate phase settings with some pre-ring suppression. Like with minimum phase settings, this will not show up in the DFC FFT graphs but will be shown in the impulse response plots and phase response will be slightly altered.
II. PCM Dithering Options
If you have a 24-bit DAC, you don't have to worry about dithering; the lowest few bits will be under the analogue noise floor anyway. However, there are still 16-bit DACs out there like those NOS TDA154X devices where it would be wise sending a dithered 16-bit stream. Also, it might be good dithering down to 20 bits for devices like the Schiit Yggdrasil. Easily done in HQPlayer. Here's what it would look like converting everything to 16/88.2 PCM:
As you can see, we can choose which dithering algorithm to use. Here are the options:
So what do those do? Well, we could read about it in the HQPlayer manual (do a search for the manual - I see version 3.20 is online). Or we can just have a look with my Oppo's output :-).
Let's start off with the basic issue.
The FFT above shows us a -30dBFS 1kHz 24/44.1 sine wave as it's upsampled but bit-depth reduced to 16/88.2 using the "poly-sinc" filter. The lowest 8 bits of the 24-bit signal have been truncated down to 16-bits without dithering performed. I had set my ADC to 96kHz so we capture the full 44.1kHz bandwidth. In green, we see the effect of this 24-to-16-bit truncation. We see the presence of "quantization distortion" leading to a very uneven noise floor. This is obviously a "bad" thing although to be honest, with real music it might not be all that audible and it really depends on the quality of the recordings - many modern dynamically compressed albums are noisier than this so with a lot of modern pop/rock, it might not even matter!
Here's what happens when we apply a few of the "standard" types of dithering to the signal:
In green this time, we have the original 24-bit signal played back without any bit-depth reduction or dithering. As we already know, the Oppo UDP-205 is capable of hi-res playback >16-bit resolution hence the nice low noise floor with a few expected harmonic distortion peaks.
If we applied the "industry standard" TPDF (Triangular Probability Density Function) dither which is pretty well ubiquitous, the noise floor becomes the yellow tracing. Notice that it's smoothed and flattened out compared to the 16-bit undithered graph above. The RPDF (Rectangular Probability Density Function) dithering looks similar but the noise level is a bit higher than with the triangular function. And we also see the "Gauss1" setting which sits a little lower in noise level than TPDF.
As an aside, back in 2014 when Meridian/Bob Stuart released its paper at the AES trying to make a big deal of the audibility of "typical audio filters", they used the inferior RPDF dithering rather than even TPDF as a test condition. This was one of the criticisms of the research as can be seen in the comments.
Now let's move on to the noise shaped dithering choices:
Noise shaping will push around the noise, shifting the noise level from the lower audible spectrum up to the higher end where our ears have lower sensitivity. As you can see, the NS5 and NS9 settings are rather aggressive and with this example of upsampling to 88.2kHz, the noise level looks very low up to 3-5kHz, and after which it rises very rapidly to an even higher level than NS1 and NS4. This is why the HQPlayer manual recommends that NS5 is optimized to 8x (352.8kHz) and 16x rates (705.6kHz), while NS9 is good for 4x (176.4kHz) sample rates.
So, following the manual's recommendation, this is what happens when instead of 88.2kHz, I upsample to 16/352.8kHz (8x) using these dithering algorithms compared to TPDF (with my ADC running at 384kHz):
So, following the manual's recommendation, this is what happens when instead of 88.2kHz, I upsample to 16/352.8kHz (8x) using these dithering algorithms compared to TPDF (with my ADC running at 384kHz):
Nice. At 16/352.8kHz, the NS9 noise floor remains very low up to ~20kHz while NS5 maintains the low noise level up to a still respectable 15kHz and crosses the level of the TPDF dithering noise floor at around 20kHz.
Finally, for completeness, here's what the last "shaped" dither setting looks like compared to TPDF (back at "poly-sinc" 16/88.2 upsampling):
Yeah, overall lower noise level with the "shaped" setting but notice that the noise floor isn't as smooth as TPDF with occasional spurious noise seen.
III. DSD Modulator OptionsNow that we have seen a bit of the different digital filters we can apply and dithering, let's consider the DSD conversion and the different sigma-delta modulator (SDM) settings that can be used. I suspect this is what audiophiles would be most curious about. Check out this page for background information about SDM and modulators. Let's cut to the chase, basically one has a choice of 5th and 7th order modulators in HQPlayer:
With 8 options to choose from, that's a lot of combinations when we consider the resampler settings and different samplerates we can use. Let's try to systematically look at the major "families" of modulators on offer. The procedure is similar to what I published previously but using realtime conversion with HQPlayer of course. I kept the resampling algorithm the same ("poly-sinc") for each of the following modulator tests.
A. DSD5 (and v2) Modulator:
Let's start with the first setting on the list, DSD5.
As I did previously, since much of the difference between modulators is in the noise level, let's start off with 24/384 tests which will allow us to capture the noise level out to 192kHz. I know of no loudspeakers with super-tweeters or headphones with frequency responses good to around 200kHz. Furthermore, I am not aware of any human ears (or even animal ears!) with sensitivity to frequencies of ~200kHz and trust that graphs going out into the MHz range which I have seen posted are a wee bit excessive :-).
Numerically and on the graphs, we really don't see much different than what was published before with the Oppo UDP-205 and DSD playback. Notice the effect of noise-shaping in DSD64 and DSD128 with noise floor rising up to around -75dBFS up at 80kHz for DSD64. Should not be a problem for decent amps and should not blow tweeters.
There is what looks like a closely related "DSD5v2" modulator option. The manual says nothing about the difference other than it's a "revised" version. To see if there was a difference, I ran the 24/384 test signal through at DSD128 and DSD512:
Looks essentially identical to me... Maybe the algorithm improved something in DSD64 or DSD512 playback I didn't measure. Maybe it improved processor efficiency. But I have a hard time believing that they would sound any different.
B. DSD7 Modulator:
Notice the effect of the higher order modulator on the noise level with DSD64 and DSD128. It's a more "aggressive" setting that keeps the noise floor relatively flat for DSD64 out to >25kHz (whereas we can see that with DSD5, the noise floor will rise quickly after 20kHz). One of the side effects is that the peak amplitude of the noise is now up at -60dB at ~85kHz. I trust this level of ultrasonic noise should not be a problem for decent amps still.
C. ASDM5 Modulator:
|For "fun", I included the THD and IMD graphs used in calculation of the distortion values.|
D. ASDM7 Modulator:
The 7th order "adaptive" SDM. Again, notice the shape of the ultrasonic noise in the DSD64 and DSD128 playback compared to the DSD5 and DSD7 modulators. It looks like an intermediate between DSD5 and DSD7; not as aggressive as DSD7 and the ultrasonic noise with DSD64 peaks around -65dB at 75kHz.
E. High Sample Rate Modulator Settings ("DSD5v2 256+fs", "DSD7 256+fs" and "AMSDM7 512+fs"):
Then there are these specialized modulators designed for higher rate DSD. When you select these, only DSD256 and DSD512 sample rates are available...
First, the most obvious is the yellow "AMSDM7 512+fs" tracing at DSD256. While "AMSDM7 512+fs" is meant for DSD512 only, when you activate it in the settings, it does allow the modulator to be used with DSD256 playback. And if one were to do so, the resulting playback noise floor looks like that of a DSD128 modulator (even though the Oppo verifies that it's playing at the DSD256 sample rate). Looks like a "hole" in the settings that should be closed off or fixed.
The other anomaly is some strange noise artifacts when playing the "DSD5v2 256+fs" modulator at DSD256 on the Oppo. It's subtle on the graph above with all the tests overlaid, but here are 2 runs showing the same anomaly in that frequency range (I actually ran this 3 times showing the same thing, but forgot to save the results for one of the runs):
Strange considering that I did not have any issue like this elsewhere at DSD256 and even with DSD512 settings. Of course, given that this is all >35kHz and way below -100dBFS, it would not be audible.
F. Selected measurements at 24/96 for crosstalk and IMD+N graphs...
Finally, I just thought I'd throw together a number of 24/96 measurements using a few modulators and DSD sample rates so I can show the crosstalk and IMD+N sweeps properly. Alas, RightMark has bugs when plotting out these graphs at >96kHz samplerate.
Other than the ultrasonic noise which we can see in the DSD64 conversion and concomitant distortions this brings, there's nothing else unusual in the crosstalk or IMD+N sweeps. Remember that the hardware is exactly the same with each of the tests above. Variations are due to changes in the software settings.
IV. Subjective listening and conclusions...Though I didn't test every single option, I think the results above provide an adequate overview of the digital filters, dithering settings, and nature of the DSD modulators HQPlayer provides. Hopefully a picture is "worth a thousand words" and the discussion above demystifies things a bit given the plethora of options. (There is no need to resort to mysticism of course whether it be hardware or software; it's all just computing tech!)
While running the tests, I took the opportunity to play some music to see if I can get a general "feel" of the different modulator settings particularly. I tried out some Aerosmith's Greatest Hits, 10cc's The Original Soundtrack (SHM-CD 24/88 rip), The 52nd Street Blues Project's live Blues & Grass, and the California Guitar Trio's The First Decade. For the most part I listened using my Sennheiser HD800 plugged into the Oppo. Honestly guys, at normal listening levels, the various settings sound excellent. As I've expressed before (as far back as 2013), I sometimes find that DSD64 changes the sound compared to PCM and can make the sound a little "smoother" and even "spatially" more pleasant as in a wider and deeper subjective soundstage.
The digital filter variants sound at best subtle to me and HQPlayer offers a good selection of high quality options as can be seen in the DFC graphs above. Dithering as mentioned would be important for 16-bit DACs so they're unlikely to be used with a modern hi-res device like the Oppo. As for the different modulator variants, I really have no preference here despite reading about folks swearing by this setting or that... There are clearly measurable objective differences of course, and as usual, conversion of the 24-bit PCM signal to DSD results in added noise at varying levels which were not intrusive in my listening. Remember, the addition of noise to the signal when we use DSD is inevitable and chasing after a "better" sound is essentially about listening for the "euphonic distortion" of the conversion process. That preference would be idiosyncratic to specific listeners and perhaps DACs. There is no "new information" being added that was not there already in the PCM data.
My testing here is with the Oppo UDP-205 and the ESS ES9038Pro DAC chip inside. Not a bad choice I think because arguably this is the best performing PCM DAC currently, so it's nice to know how it handles DSD. It's possible that other DAC chips will show significantly different results than the ES9038Pro. As usual, while I can measure and show differences, this doesn't mean the differences are necessarily audible.
By the way, HQPlayer can handle multichannel and can perform convolution DSP; neither of which were used here.
So... The bottom line...
1. HQPlayer provides a nice collection of resampling digital filters to choose from. They work without overloading and suppress ultrasonic artifacts very well. It looks like HQPlayer does this by providing a bit of attenuation for the headroom, this is likely why if we compare the computed RightMark results, you'll tend to see that the noise level appears higher and dynamic range lower with HQPlayer than JRiver 24 PCM-to-DSD measurements by about 3dB.
These filters would be a great complement if you're running NOS DACs that can accept high samperate material, and the dithering algorithms provide many options for those who are still using 16-bit DACs. However, if your DAC already provides good filtering and you have no special needs around dithering, it's unlikely you will hear any additional benefit unless of course you prefer to upsample PCM to DSD with the modulators provided.
2. HQPlayer needs quite a bit of horsepower if you're planning to do realtime PCM-to-DSD/SDM conversion; especially if you intend to aim for DSD256+. Your CPU also needs to have SSE4.2 instructions for the 64-bit version (should be fine with any reasonably fast CPU in the last decade). As I did in this post, you can offload some of the calculations to a nVidia GPU with CUDA. The caveat with this is that powerful computers and graphics cards are not fanless currently (and I don't like the sound of computer fans in my sound room). One should then put the server in another room and stream through a high bandwidth gigabit ethernet system to a NAA (Network Audio Adapter) streamer.
3. From a sound quality perspective, I don't think you could go wrong with any of the "sinc" resamplers and DSD modulators I tested out. While I remain agnostic around which DSD/sigma-delta modulator is "best", I accept that people can have subjective opinions on this since there are real differences in distortion and noise levels between the different settings. Perhaps certain settings could lead to more "euphonic" output depending on one's gear. But I believe sonic differences would be at best subtle though based on my own listening and what the results tell me.
4. Notice again, like the last time I measured the Oppo UDP-205 DSD playback, noise floor level increases particularly with the jump from DSD128 to DSD256 and goes back down a bit with DSD512. I suspect there is a good explanation for this. I have not tried measuring my other DSD256+ capable gear at this point to compare how non-ESS DACs perform.
5. The GUI works but is rather spartan compared to many player software out there. This is why historically HQPlayer is used in conjunction with software like Roon for the user interface and library functions. Consider this into the complete system price when incorporating HQPlayer.
Another issue I had was that the program seems to buffer whole tracks or at least large proportions of tracks then begin the conversion before playback. This is fine for PCM upsampling but when doing DSD256 or DSD512 conversion, it can take many seconds to start playback. This wears on one's patience especially when it can take >10 seconds to start playback even with an overclocked >4GHz quad-core i7 processor with GPU assist. I know there are audiophiles who think buffering to RAM makes a big difference... But surely not when latency can be this severe, right?
6. Have fun with the demo and see if it meets your needs. It is a nice way to experiment on upsampling, trying different filter settings and listen to realtime PCM-to-DSD conversion with a 30-day trial. It's good to have the experience as an audiophile.
Whew! I knew going into HQplayer would take a bit of time and effort to characterize a number of the options it provides. (Which is probably why I procrastinated over the years in writing about this program.)
I know there has been discussion about the "Do digital audio players sound different? (Playing 16/44.1 music.)" blind test and whether capturing the 16/44.1 output as 24/96 conveys the "sound" of the devices being tested including the effects of the filters.
IMO, 24/96 is certainly adequate for the purpose and I'll talk about why this is next time... In the meantime, please keep sending in your results. Big thanks to those who have already done so!
Back in December, I mentioned that I finally updated my main computer from 16GB to 32GB RAM. That is a little bit of a milestone considering that RAM requirements really haven't increased much for many years now for home use. This past week I finally hit another computer milestone and got my first 1TB SSD:
Nothing special, just a WD 1TB Blue SSD; I was also tempted by the Samsung 860 EVO 1TB for a few more bucks. What is remarkable of course is how fast prices are dropping - down to US$130 these days for that terabyte. I remember clearly a decade ago in 2008 buying my first 1TB hard drive (a Hitachi Deskstar). In just a handful of years from now, I believe we'll be able to all own multi-terabytes of solid-state storage for a few hundred dollars for large lossless and high-res music collections. Exciting.
By the way, through my 10GbE home network, I'm seeing throughput of >300MB/s (~3Gbps) Windows sustained file copy from SSD to SSD between my upstairs Workstation to the basement Server computer over Samba. Not bad. Looking forward to the day when every storage device can transfer data at such a speed over the home network on low-power storage devices, silently, without hard drives going to sleep or any spin-up time. That's what technological progress looks like.
Time to take a break and enjoy some music. I'm liking the ethnic/jazz blend of Que Vola? tonight as I complete this article. Until next time, stay rational dear audiophiles...