HISE Logo Forum
    • Categories
    • Register
    • Login

    Convolution gain louder at higher sample rates

    Scheduled Pinned Locked Moved Bug Reports
    samplerateconvolution
    37 Posts 7 Posters 2.7k Views
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • Dan KorneffD
      Dan Korneff
      last edited by

      Also noticing that the AudioWaveform panel is affected by files at different sample rates as well.
      Check out these images.
      Same IR at different sample rates.

      44.1k
      WAVE 44.png

      96k
      WAVE 96.png

      There also seems to be a center offset for mono files as well?

      Dan Korneff - Producer / Mixer / Audio Nerd

      1 Reply Last reply Reply Quote 0
      • Dan KorneffD
        Dan Korneff
        last edited by

        @Christoph-Hart I was going to use Simple Gain to compensate for the level difference, but I'm getting an error.

        var SR = Engine.getSampleRate();
        const var Label1 = Content.getComponent("Label1");
        Label1.set("text", SR);
        

        Within HISE, this code works. But in a DAW, Engine.getSampleRate() returns -1

        Dan Korneff - Producer / Mixer / Audio Nerd

        1 Reply Last reply Reply Quote 0
        • Christoph HartC
          Christoph Hart
          last edited by

          The onInit callback will be executed before the samplerate is known in a plugin so you need to make sure to defer that - you're safest bet would be a script FX and its preparedToPlay callback because this is where you usually setup the processing stuff.

          But just out of curiosity because your numbers differ vastly from my ones: what did you measure for the file you've uploaded? I am still not sure if this is a constant gain factor and how much does it depend on the impulse response type.

          Dan KorneffD 1 Reply Last reply Reply Quote 1
          • Dan KorneffD
            Dan Korneff @Christoph Hart
            last edited by

            @Christoph-Hart I'll measure those impulses asap

            Dan Korneff - Producer / Mixer / Audio Nerd

            1 Reply Last reply Reply Quote 0
            • Dan KorneffD
              Dan Korneff
              last edited by

              for the file I uploaded
              44 = -18
              48 = -17.6
              88 = -14.9
              96 = -12.6
              174 = -11.7
              192 = -11.9

              Dan Korneff - Producer / Mixer / Audio Nerd

              1 Reply Last reply Reply Quote 0
              • Dan KorneffD
                Dan Korneff
                last edited by

                I'm just noticing that the first IR I uploaded was a stereo file, and the rest were mono. That appears to make a difference on the output level as well.

                Dan Korneff - Producer / Mixer / Audio Nerd

                1 Reply Last reply Reply Quote 0
                • Christoph HartC
                  Christoph Hart
                  last edited by

                  Yeah sure, let's add that to the number of weird reasons why the gain goes up. What else? The length of the filename? :)

                  Dan KorneffD 1 Reply Last reply Reply Quote 1
                  • Dan KorneffD
                    Dan Korneff @Christoph Hart
                    last edited by

                    @Christoph-Hart 🤣

                    Dan Korneff - Producer / Mixer / Audio Nerd

                    1 Reply Last reply Reply Quote 0
                    • M
                      mwplugs
                      last edited by

                      convolution is producing a distorted digital noise at sample rates 44.1 and 48khz anything above the behave perfect. but with every one tested there is a distortion below 88.2

                      Dan KorneffD 1 Reply Last reply Reply Quote 0
                      • Dan KorneffD
                        Dan Korneff @mwplugs
                        last edited by

                        @mwplugs I'm about to add convolution to a project. I'll report what happens on my end.

                        Dan Korneff - Producer / Mixer / Audio Nerd

                        M 1 Reply Last reply Reply Quote 0
                        • M
                          mwplugs @Dan Korneff
                          last edited by

                          @dustbro ok yeah i cant figure it out for the life of me

                          1 Reply Last reply Reply Quote 0
                          • Dan KorneffD
                            Dan Korneff
                            last edited by Dan Korneff

                            @Christoph-Hart I could use a little help getting Engine.getSampleRate() to work properly.
                            I would like to use the sample rate as a variable to compensate for the gain difference with different sample rates.
                            I've added a global variable with Engine.getSampleRate() to the preparedToPlay callback, which works in HISE, but the exported plugin shows "undefined" for the sample rate. 🤷

                            here's a snippit:

                            HiseSnippet 1224.3oc0X8+SabCE2GvMQRajZq1e.V7SAsD5EZfRWU0nDftnUfnFFqSUnNm6bRrvw9zYGFYUU6Os8ezz9OX6YeG4tKbvXYZnQ9g.98M+487yedF5DI8oJkLB4T53IgTjyCc6NQnG1ZHgIPs2E47DWEYTHmhiHZJVSUZzNSBIJEM.43r3aL14TZIj8ye7M6P3DgOMUDBchj4SeKaDSmJsy1eGiy2mDPOlMJi0M2tsuTzRxkiALsnqGJj3eFY.8PhwrEbQNewdALsLpqFviBrYGYvjtCk+rH19SXJVON0rnApKDnXwnVCY7fNWluJDxYoNoY+hwY+W5d.KfMUdZU3QVE3TOxVCbVHOjVJGjZbcPZeIOvDfqAdNYf2Rwv6wtc8iXg5TMFr8.21BMMpOAJ6YgUrsnE90EcaIAKD50FQNiteDrXpGU2zyqFdCOuUeYkxUJCEekFeNIB20dp+NHidKoGkieE9xfLfpaIGEJEvhpqLicqXhSZTLsGFioBEQyjBHL19KSP1qeepODgYsYkXnLSfWSQAa0zKzqTCmrqXi1uFuB9qveqToS8X0Whe5SwfGXtE7ZINSW70lnLPzqvenYyFPQo4Vdv2as05v2uXSyu234a1z7iW.h7N0tEDNGGJU1y2ragJ+djM8NgvGSUl8wqV8F0puds5OqV8l0puwoSQshYiz.nxXvtdHSAwA7yD19xHbUEFTkG5qVo7mpTFCeLa4AvQ83v1h.5ElhdNKWiYDeT+pET0fCFrUMV1GODzmuxYBe72ydrYNfdsVGw5MVSqdEsFA0JnP7gL.8zUutJfM4MHJKYjElUJ+YSQAJKiE91VLo3Poldjn5pk+T4Rk+bY7rp52uPclF7HImSiJTsgoJ5lbrpX7ndznZwncpgv0277CO31wO3GeeKigRQaASeDTAiWmxfXzEm0Wp0CMMYyJJMGyJ0lZEXVpnqRPgR3Cfe66auKQSLbVIx.6BoQZlIac1kdNL.HlAqj6tT0YZYn01DRDjiq1psRB+l8BOhEXY7xSCftHcXwnsmjt3G21vMXnvywMXuECyatBWJvnKCFyI57z7l1zDEvYaN9TCmoPwzSxNu6e.2uWgb+MJpzdKg6ic6vz9CKFuKT.dgin+qwaxjzJtwz6ofcI28e+cvXyEtZsqbRaEr+Ff7vjk38eeihFX576toWtCingjH5wxNbxjppoMi0v83R+y5x9k3K5C3xdD9Lig.h28DCXBpYbWp3plAbkfqJJImtVXDyLG8JdVzTsb7NgwI5NFbT0eHQHnb07PO4l+bX4a24PdxH3gZYqTobTYQ4Mxv72zh8N4XMSL3.BLgA3.bOb7ntviD8osRxbPlyBFZo30dl0lN9tTQfcweBeRT1vr1IQYiKU9ujQK6sfkm9ZZ6br2j9Z5YGLdcul9m.1keaWJTKyd88GXA5gYI8J381sEmCHsijShl8x+h2zamaLmuc9lYnLoD9dCi5Sbsk76S.11Rb+AvOxsC4+CMD2E7I2E6wHhej7i9wrolqlKak.4sv9mLWx8.yZbCjk1G7y0aMOzH3Om8i99lwx0g5Sw9r9b3yylCeZNG9rwb3ylygOOeN7YqazGy+IgWOVKGE2+CB5rmcZiiydBBzIauJf9KvoIPOm
                            

                            Dan Korneff - Producer / Mixer / Audio Nerd

                            1 Reply Last reply Reply Quote 1
                            • Christoph HartC
                              Christoph Hart
                              last edited by

                              You're declaring the global variable in the prepareCallback itself (I wasn't aware that this is possible, might have to add a safe check to prevent this at some point).

                              This means that the variable will be initialised long after the interface script has run, so undefined is exactly what's happening...

                              BTW, the safest way to use global variables is to define them in the first script (most likely the interface script) and also tuck them behind a condition so that it just gets initialised if it doesn't exist:

                              if(!isDefined(myGlobalVariable))
                              {
                                 global myVariable = 90;
                              }
                              

                              If you don't do this, the variable will get reinitialised everytime you compile the interface script which is not a problem in your case, but might lead to annoying issues when using more complex data (because the other scripts might use a reference to the old object).

                              Dan KorneffD 1 Reply Last reply Reply Quote 2
                              • Dan KorneffD
                                Dan Korneff @Christoph Hart
                                last edited by

                                @Christoph-Hart Thanks so much for this! I think I have it (mostly) working.
                                Any words of advice on how to deal with a user changing sample rates while the plugin is loaded?
                                I tried this in the preparedToPlay callback with no luck

                                if (HostSampleRate != Engine.getSampleRate())
                                {
                                     ..... some function to update HostSampleRate
                                }

                                Dan Korneff - Producer / Mixer / Audio Nerd

                                lalalandsynthL 1 Reply Last reply Reply Quote 0
                                • lalalandsynthL
                                  lalalandsynth @Dan Korneff
                                  last edited by

                                  @dustbro said in Convolution gain louder at higher sample rates:

                                  uch for this! I think I have it (mostly) working.
                                  Any words of advice on how to deal with a user changing sample rates while the plugin is loaded?
                                  I tried this in the preparedToPlay callback with no luck

                                  Was this ever solved or do I need to monitor the sample rates and change gain accordingly ?

                                  https://lalalandaudio.com/

                                  https://lalalandsynth.com/

                                  https://www.facebook.com/lalalandsynth

                                  https://www.facebook.com/lalalandsynth

                                  lalalandsynthL Dan KorneffD 2 Replies Last reply Reply Quote 0
                                  • lalalandsynthL
                                    lalalandsynth @lalalandsynth
                                    last edited by

                                    @lalalandsynth ittybittybump. :)

                                    https://lalalandaudio.com/

                                    https://lalalandsynth.com/

                                    https://www.facebook.com/lalalandsynth

                                    https://www.facebook.com/lalalandsynth

                                    1 Reply Last reply Reply Quote 0
                                    • Dan KorneffD
                                      Dan Korneff @lalalandsynth
                                      last edited by

                                      @lalalandsynth I believe you still have to self monitor these changes

                                      Dan Korneff - Producer / Mixer / Audio Nerd

                                      Christoph HartC 1 Reply Last reply Reply Quote 0
                                      • Christoph HartC
                                        Christoph Hart @Dan Korneff
                                        last edited by

                                        Actually I'm not sure whether this is a bug in the convolution engine or a physical /mathematical law that you need to counteract manually. I'd love to encorporate a automatic fix for this into the convolution module directly, but it's not so easy, so maybe something can help me out here.

                                        Let's assume we have a impulse response at 48 kHz with a single dirac at 0dB at sample position 512. And we're convoluting a signal with the same samplerate, then it would be a simple static delay of 512 samples without modification of the gain. Now If we switch to 96kHz, the impulse response needs to be resampled to match the 96kHz signal input. However this means that the upsampling will duplicate the dirac impulse (so that in the 96k response, we'll have a dirac at sampleposition 1024 and 1025, both at 0dB. If we now convolute the 96k signal, we'll get two delays short after each other which basically causes a +6db gain.

                                        In this simple example, the solution would be a 6dB attenuation when we double the samplerate (+12db if we quadruple it, etc), but this is only working for this extremely simple test case - as soon as you have a "real" impulse response the upsampling will not be in this linear relation.

                                        I'm not sure how other convolution reverbs take this into account (or if they don't), so if anybody has a clue about this, let me know.

                                        d.healeyD 1 Reply Last reply Reply Quote 2
                                        • d.healeyD
                                          d.healey @Christoph Hart
                                          last edited by d.healey

                                          @Christoph-Hart Might be of interest - https://github.com/juce-framework/JUCE/commit/68d30f9c8d8571acf43a39caffc7d5b64ed9f253

                                          And here's the forum post - https://forum.juce.com/t/dsp-convolution-changing-level-depending-on-the-host-sample-rate/

                                          Libre Wave - Freedom respecting instruments and effects
                                          My Patreon - HISE tutorials
                                          YouTube Channel - Public HISE tutorials

                                          Christoph HartC 1 Reply Last reply Reply Quote 1
                                          • Christoph HartC
                                            Christoph Hart @d.healey
                                            last edited by

                                            @d-healey Well the comment below the commit is correct, the problem is that you can't expect the linearity between resample factor and output gain - you even can't expect the gain change to be the same for each input signal, so it's a highly imprecise thing after all.

                                            lalalandsynthL 1 Reply Last reply Reply Quote 0
                                            • First post
                                              Last post

                                            34

                                            Online

                                            1.7k

                                            Users

                                            11.8k

                                            Topics

                                            103.0k

                                            Posts