Convolution with Null filters are audible

Roon version - 1.5 (354)
Mac OS - Mojave 10.14
Macbook Pro Mid 2014, Processor 2.5G, i7, 16G memory used as Roon remote only.
Roon Server and Streamer - Pink Faun 2.16x, Arch Linux OS, music stored in internal SSD
Ethernet from WiFi Orbi router in room to Pink Faun Streamer

Hi, I have been working with Thierry from HAF to generate convolution files for Roon. But I had difficultly to get a set that absolutely works for me. Eventually I discovered that by using a NULL filter I could still hear the difference with convolution on or off. This means that the Roon convolution process is audible.

I tried this process using two types of Null filters - a NULL WAV file and zip file of .cfg and WAV files for all frequencies. Both filters are audible and make the sound less dynamic or softer.

It is also measurable using a sweep file and db meter showing a lowering of 1db at my listening volumes.

Is this a known issue and is Roon working on this?

1 Like

this is a very interesting observation.
You’ll need to remove the level difference (to less than 0.1 dB) to be certain of the difference between direct and via convolution with the NULL filters. I do not doubt that you can hear a difference, however your test will see better ‘reception’ with both forum members and Roon staff if the level difference is dealt with (and properties of the NULL filters explained).

My method of measuring the drop in sound is pretty crude - but is what is available to me. I use the “Chesky Records 10 best” CD that includes a Subwoofer crossover test file which is basically a low frequency sweep. I use the iPhone app called db Meter to measure the frequency and db of the sound.

With this, I found that 37Hz frequency plays around 1db lower when NULL convolution filters are switched on in Roon. I didn’t make any adjustment in volume while doing this. The act of switching on the convolution in Roon produces the drop. I didn’t test other frequencies and stopped after discovering this single anomaly.

The NULL filters are produced for me professionally by the French company HAF. Thierry there is very helpful and has produced many sets of filters for me to try in made a NULL set when I requested for it. Exactly what is inside I cant say but it’s basically filters that do nothing. Theoretically it doesn’t adjust the sound at all, what goes in should be what comes out.

He gave me 2 versions - a simple WAV file that contains nothing and the normal zip set with many null wav files for different frequencies. Both show the same issue. Attached is the simple blank WAV file I used. A do nothing filter is a single pulse so a click when you listen to it. Just add to the Roon convolution plugin and it should work.

There is a lowering of dynamics or softening of sound I can hear when I use these NULL filters. Does anyone that is using convolution have this same issue? Can someone try to see if they can recreate the problem?

The measurement is only a secondary matter to see if I could measure a difference. For me, the NULL filters are audible

My system is pretty revealing and at this level, the small drop in dynamics is sufficient for me to stop using convolution. Wondering if anything can be done on the Roon side?

I’ve downloaded the file and hope to be able to test this during the weekend. Meanwhile this is something I believe @brian ought to have a look at. There should be no level difference with the DSP engine in the loop and provided the NULL filter is really NULL there should be no discernible difference in sound either.
I use convolution with my speakers and depend on it for acceptable sound in my room so your report worries me…

I cant listen to music without these filters, maybe -1dB is like overhaed so that there is no clipping

You may find this EBU Technology reference test set useful for any further test measurements.

Also, it would be helpful if you could use REW for these measurements.
It produces lots of information from a measurement that most people are familiar with.

Hello @Leong_Kin_Foong1,

Thank you for the report. I’m passing this information along to the tech team for comment. I will be sure to let you know when they have had a chance to take a look at this behavior you are reporting.


Our convolution engine does not have a a built-in headroom adjustment or anything like that. Assuming you provide a music file and filter with matching sample rates, it is just a straight mathematical convolution operation.

However–if your filter and content do not match, we need to resample the filter, and this is where things get tricky, because when a filter is resampled naively, it sometimes changes the perceived volume. Roon has something in place to compensate for that, but it is not a perfect science–this is probably where the difference is coming from.

It is best to generate separate filters for each sample rate and avoid filter resampling all together–this is what Acourate and REW do. That way the person or software that is designing the filters has made the judgement calls about how to scale the filters instead of depending on the player to do it automatically.

Gain adjustments in the 64bit float domain aren’t lossy. If you are measuring -1dB with your real filter (the NULL filter + your filter may provoke different compensation amounts, so you would need to measure this using the real thing in the room with a meter and a test tone), stick a procedural EQ block in there and reverse the attenuation that you measured. There is plenty of numerical headroom in the system to ensure no information loss.

The sample wav NULL filter provided by @Leong_Kin_Foong1 is 44.1 kHz so playing 16/44.1 material through this filter should produce no difference in level or sound?

Maybe Thierry from HAF could jump in here and provide some detail on the NULL filter? I do not know if he is a member of this forum though…

EDIT: I let Audiolense produce filters for all sample rates, same as Acourate and REW. I believe this is what the OP normally uses too (the ‘zip set’ he mentions)

I don’t see any scaling in the code. Should just be mathematical convolution.

Hi @Leong_Kin_Foong1,

Just for fun, I tried to reproduce your level difference between no DSP, and ‘straight’ convolution with your WAV.
In a more direct way : by directly measuring the output voltages.
I can only measure with a 0.001V resolution, and that shows no difference at all. Meaning in my case: the difference, if any, must be a lot smaller than +/-0.01dB. Close enough ;-).
In short : I cannot reproduce, what you experience.

I suggest that you try to measure this,as well. Not as a solution, but just to know what the situation is.

In case you are certain of that 1dB difference : Try to make up for that loss. Include a 1dB gain in your DSP, and try a compariaive listen again.
Are you still hearing a difference ? (Reason for this test is to be sure that you are hearing a ‘quality’ degradation, and not an attenuation).

By the way : your measuring method right now, is highly unreliable. Honestly speaking, I’m a bit surprised you are only seeing a 1dB difference…
Move your mic (or phone) just a slight bit, and you can be certain that you are measuring a different result. Even if nothing had changed, at all…

Regarding the subjective portion of this : I will not bore you with my opinion :). I’ll suffice by saying, that I’m not hearing a difference.

The measurements I took are pretty crude I admit - it was only done as an attempt to see why I heard a difference. I’ll experiment with the above suggestions as much as I can. Thanks for that.

Does anyone else hear any difference with dynamics when using a null file with music? To simplify, let’s just use 44.1 for now. I’m finding less finer details from voice. Less engagement and presence overall. Subtle for sure but it’s there. I don’t think its volume related only as I can’t get the presence back by turning up the volume.

Like others here I really want to use convolution to solve a few room nodes I have but not at the expense of detail and presence.

With @Marco_de_Jonge 's measurements the level question is definitely out of the way. Thanks!

@Leong_Kin_Foong1 I’ll try to do some listening during the weekend and make sure I only use 44.1 material for testing.

For now, I can confirm that the reference WAV filter is indeed ‘clean’. In the sense that it should theoretically do nothing at all.
It is a single, one-sample peak at 0dBFS. Nothing else. It has a clean spectrum : straight line between 0-22050 Hz. It should do nothing at all, both from the levels, frequency response, and the timing perspective.

To be clear : when I said ‘I don’t hear a difference’, I meant to say that in a generic sense. I did not listen to your specific filter yet.
I will try to do that over the weekend, with an open mind. I do however need to tell up front, that I am biased towards the objectivy side. Noboby can set aside their bias, completely…

Jumping to conclusions a bit too early : I’d say there is either ‘some’ technical problem (in Roon or in your setup), that deserves attention. Or you are having difficulty, setting your own bias aside (which is completely normal, and ab-so-lutely not meant in an offensive way).

1 Like

Not offended in the slightest :smile:, just looking for a solution. Thanks for confirming the WAV is indeed a null file. I have confidence in HAF.

Pretty certain it not bias hearing the difference and hope it’s a simple solution - doesn’t matter to me how. Either adjustment of my own system or if indeed it’s Roon, then look forward to a technical solution.

Also look forward to the the hearing tests to confirm what’s happening. Thanks in advance for those trying - Ogs and Marco


Of course you can have confidence in Thierry. I just thought it’d be better to be sure, instead of being confident ;-).

It would still be good to know your output voltages. Any cheap $5 multimeter will do, for observing level differences this large.
Play a test sine wave, and measure over either the loudspeaker terminals, or the line output. Change nothing except for convolution on/off, and compare the values. Just to know if there indeed is a level difference.

In the meantime : nobody’s home this evening, so I had the opportunity. I did my very best, but was not able to notice audible differences between DSP=off, and convolution=NULL. Sorry, I really did hope there was something. I like problems :slight_smile: .

Roon has no line input, and as such, I cannot make accurate, realtime measurements through it. (Cannot rely on anything time-related)
This makes it (for me) impossible to directly proof, whether the output stream is modified or not.

I have ideas for approximations of such proof. But I know up front, that these measurements will contain errors by nature…
I doubt, if that would be useful information.
Just let me know if that’s interesting. Makes no sense to put a lot of effort, into something that you don’t need :).
(Oh, of course this would still say NOTHING about your situation. Just my own situation, which I believe to be transparent).

At least, you now have one ‘I don’t hear it’ reply. Useless as it may be, as it solves absolutely nothing for you :wink: .

I’m hesitant to write the next 2 paragraphs, as I know that the average reader will draw incorrect conclusions from them.
I write it anyway, because I think it’s an interesting observation. Please keep this in mind while reading.

It seems that the bitstream is (indeed) no longer 100% bit perfect, when this NULL filter is applied.
As I have no direct method of checking that, I just tried to feed a DTS stream through it. If it comes out as DTS, then you’re sure that nothing has changed. If it doesn’t, then something MUST have been changed.
Turns out, that the stream is no longer a DTS stream, as soon as I load the NULL filter. Thus, something must have changed.
(The file used, was a DTSwav. Which is a multichannel DTS file, but encapsulated in a 44.1/16 stereo WAV. It should just be passed through as a stereo WAV, and only become multichannel sound once your receiver decodes the stream)

I do not know why. Perhaps there are slight changes / rounding errors in the double bit depth conversion. Although that does not seem logical to me.
Perhaps something else. I’m not that knowledgeble in digital audio. Perhaps this could be a fun question for @Brian ?

Now, what I find more important : does that also reflect in the analog/electrical domain ? In other words : does that change, alter something in the final sound ?

As said, I cannot make proper measurements through Roon; my equipment requires Roon to have a line-in for that.
So I had to make some nastier measurements (which I really don’t like doing…).
Setup involves two soundcards : one very very highend card. And the other is the onboard one of an Intel NUC. Which is pretty bad, and which is the main reason why some of the numbers are not as pretty as they should be.

Instead of giving you 12 graphs, I’ll just give you the most relevant numbers.
I can give you the graphs if you want, but they are só close to each other, that it borders on insanity :


You should know or observe the following with these numbers :

  • All deviations you see, are within the error or repeatability. Meaning : measuring the exact same thing twice, can give the same deviaton.
  • You spoke about dynamics, and ‘detail and precence’. The latter one is a subjective one (as opposed to a measureble quantity). I would personnally seek this in the frequency spectrum. As you can see : there are virtually no differences, there . The largest one is 0.35-031 = 0.04dB.
  • Dynamics : My measurements are flawed here by the NUC. There must certaintly be more dynamic range (and less noise), than 92dB.
    In any way : you can hardly observe a difference. More important : 92dB is already way more than the (instanteneous, mind you!) dynamic range of your hearing.
    And most certaintainly : way more than is possible, or even desirable, to achieve in a normal living room.
  • Dynamics/noise again : I can improve this measurement, by turning up the NUC volume (not good for all other measurements, it’s now pushed too hard),
    This way, I could see there is still no difference around -104dB. An insanely low level; I can guarantee you there is no human the world that can hear a signal 104dB lower, than the larger signal.

Wheh, this post grew a lot larger than I thought before starting :yum: .

TLDR : Yes, bitstream seems to be changed. I cannot be sure right now, however. It can be a minor change that does not relate to audio reproduction, at all.
But as unlikely as it seems : I cannot deny, that the other extremity is a possibity too.
When checked in the analog/electric domain : no change can be observed. Not even humanly-undetectable small ones.

OH : Would you please let me know, in case this kind of info is not desirable in your topic ? I know how sensitive audio enthousiasts can be, when presented with numbers and theory… Just as as sensitive as ‘objectivists’ are, when presented with opinions and findings :rofl: .

Hi Marco,

Interesting posts thankyou. I don’t know anything about the DTS codec so what follows is just a guess.

Convolution is a mathematical operation on two functions to produce a third function that expresses how the shape of one input function is modified by the other. The resulting function is the integral of the product of the input functions after one is reversed and shifted and hence is a type of integral transform.

If the DTS file format includes a flag that identifies a stream as DTS to the codec, it may be that performing such an operation on the stream unsets that flag, even if the resulting function turns out to be identical to an input function.

1 Like

I would not expect the bitstream to be maintained bit-perfect through any processing. At the very least, we are going to dither when coming back down out of 64bit float…and that is not bit-perfect.

Short, but very clear answers. Thanks both! Did not think of dithering… Glad you’re applying it, anyway;-).

I know enough now, I’ll stop looking for imperfections. Nothing strange seems to be happening.