Less Loss med SoX volume kontrol - ikke egentlig

PeriodeLytter

Hi-Fi freak
Ble medlem
26.02.2013
Innlegg
3.103
Antall liker
2.582
Grunnlaget for denne posten er Mr. Milot's Leedh Processing Volume som enkelt velger bort prioritere nominelle decibel nivåer typsik -1dB til fordel for verdier som gir minst avrundingsfeil.

"The key idea behind the alternative approach is to minimize information loss at truncation stage. For instance, consider a signal represented in 24bits words (MSB aligned). If volume control coefficients were limited to 8 bits and the input signal had 16bits resolution, no truncation would occur and no information would be lost. This trivial example hints towards the principle governing the alternative digital domain volume control: Minimise the number of bits K used to quantize volume control coefficients so that information loss is minimized at truncation stage. In other words, it trades volume control coefficients precision against information loss minimization."

Etter først kommet over sjokket at man kan ta patent på et så enkelt men genialt prinsipp ble jeg nyskjerrig på om SoX kan lures til å treffe "sweet spot" med sitt -v [FACTOR] parameter

F.eks. følgende script vil liste alle 1-bit shift fra faktor=1 som alle resulterer i 16-bit uten avrundingsfeil.

Kode:
#!/bin/bash
audio='noise.wav'
function mySoX(){
    local tmp=$(sox -v $1 "$audio" -n stats 2>&1 | grep -i "Bit-depth" | sed 's/[^0-9.]*//g')
    local bitd=$(head <<< "$tmp")
    local bitdepth="${bitd:0:2}"
    local b="${bitd:0:2}/${bitd:2:2} ${bitd:4:2}/${bitd:6:2} ${bitd:8:2}/${bitd:10:2}"
    # calculate decibel: dB = 20 × log10(FACTOR) 
    local mydB=$(echo "scale=4;20*l($1)/l(10)" | bc -l)
    echo "SoX -v [FACTOR]: $1   $mydB dB   Bit-depth: $bitdepth  [$b]"
}

function halfsteps(){
    echo "Divide each factor by 2 in 15 steps"
    echo "---------------------------------------------------------------------------"
    mySoX $1         #
    for i in {1..15}; do

        # go down in -6dB step from start
        [ -z "$newstart" ] && newstart=$1
        tmp=$(echo "scale=10;$newstart/2" | bc -l)
        mySoX $tmp
        newstart=$tmp

    done
}

halfsteps 1  # -v [FACTOR]
exit 0
Divide each factor by 2 in 15 steps
---------------------------------------------------------------------------
SoX -v [FACTOR]: 1 0 dB Bit-depth: 16 [16/16 16/16 16/16]
SoX -v [FACTOR]: .5000000000 -6.0204 dB Bit-depth: 16 [16/17 16/17 16/17]
SoX -v [FACTOR]: .2500000000 -12.0408 dB Bit-depth: 16 [16/18 16/18 16/18]
SoX -v [FACTOR]: .1250000000 -18.0621 dB Bit-depth: 16 [16/19 16/19 16/19]
SoX -v [FACTOR]: .0625000000 -24.0825 dB Bit-depth: 16 [16/20 16/20 16/20]
SoX -v [FACTOR]: .0312500000 -30.1038 dB Bit-depth: 16 [16/21 16/21 16/21]
SoX -v [FACTOR]: .0156250000 -36.1242 dB Bit-depth: 16 [16/22 16/22 16/22]
SoX -v [FACTOR]: .0078125000 -42.1454 dB Bit-depth: 16 [16/23 16/23 16/23]
SoX -v [FACTOR]: .0039062500 -48.1659 dB Bit-depth: 16 [16/24 16/24 16/24]
SoX -v [FACTOR]: .0019531250 -54.1871 dB Bit-depth: 16 [16/25 16/25 16/25]
SoX -v [FACTOR]: .0009765625 -60.2076 dB Bit-depth: 16 [16/26 16/26 16/26]
SoX -v [FACTOR]: .0004882812 -66.2288 dB Bit-depth: 16 [16/27 16/27 16/27]
SoX -v [FACTOR]: .0002441406 -72.2492 dB Bit-depth: 16 [16/28 16/28 16/28]
SoX -v [FACTOR]: .0001220703 -78.2705 dB Bit-depth: 16 [16/29 16/29 16/29]
SoX -v [FACTOR]: .0000610351 -84.2909 dB Bit-depth: 16 [16/30 16/30 16/30]
SoX -v [FACTOR]: .0000305175 -90.3122 dB Bit-depth: 16 [16/31 16/31 16/31]


Tester viser at sox's -v [FACTOR] faktisk har en oppløsing på 9.5 desimaler. En milliard muligheter gitt at jeg ikke med sikkerhet har funnet hvor halvdesimalen havner
Derfor ble en brute force skanner med valgfri desimaler og regel om bitdybde laget. Følgende er resultat fra denne testen med 4 desimaler og maks 24-bit:

SoX -v [FACTOR]: 1.0000000000 0 dB Bit-depth: 16 [16/16 16/16 16/16]
SoX -v [FACTOR]: .9375000000 -.5602 dB Bit-depth: 20 [20/20 20/20 20/20]
SoX -v [FACTOR]: .8750000000 -1.1596 dB Bit-depth: 19 [19/19 19/19 19/19]
SoX -v [FACTOR]: .8125000000 -1.8032 dB Bit-depth: 20 [20/20 20/20 20/20]
SoX -v [FACTOR]: .7500000000 -2.4981 dB Bit-depth: 18 [18/18 18/18 18/18]
SoX -v [FACTOR]: .6875000000 -3.2538 dB Bit-depth: 20 [20/20 20/20 20/20]
SoX -v [FACTOR]: .6250000000 -4.0825 dB Bit-depth: 19 [19/19 19/19 19/19]
SoX -v [FACTOR]: .5625000000 -4.9971 dB Bit-depth: 19 [19/20 19/20 19/20]
SoX -v [FACTOR]: .5000000000 -6.0204 dB Bit-depth: 16 [16/17 16/17 16/17]


Vi behøver kun finne treff innenfor første bit (-6.0206dB) da resten vil repetere.

Før inn -v [FACTOR] fra hvilken som helst av disse treffene i scriptet over og få at alle nomilenne dB resultatene med samme krav til bit dybde. Her vist for [FACTOR] 0.75 som behøver 18-bit:

Divide each factor by 2 in 15 steps
---------------------------------------------------------------------------
SoX -v [FACTOR]: .75 -2.4981 dB Bit-depth: 18 [18/18 18/18 18/18]
SoX -v [FACTOR]: .3750000000 -8.5194 dB Bit-depth: 18 [18/19 18/19 18/19]
SoX -v [FACTOR]: .1875000000 -14.5398 dB Bit-depth: 18 [18/20 18/20 18/20]
SoX -v [FACTOR]: .0937500000 -20.5611 dB Bit-depth: 18 [18/21 18/21 18/21]
SoX -v [FACTOR]: .0468750000 -26.5815 dB Bit-depth: 18 [18/22 18/22 18/22]
SoX -v [FACTOR]: .0234375000 -32.6028 dB Bit-depth: 18 [18/23 18/23 18/23]
SoX -v [FACTOR]: .0117187500 -38.6232 dB Bit-depth: 18 [18/24 18/24 18/24]
SoX -v [FACTOR]: .0058593750 -44.6445 dB Bit-depth: 18 [18/25 18/25 18/25]
SoX -v [FACTOR]: .0029296875 -50.6649 dB Bit-depth: 18 [18/26 18/26 18/26]
SoX -v [FACTOR]: .0014648437 -56.6862 dB Bit-depth: 18 [18/27 18/27 18/27]
SoX -v [FACTOR]: .0007324218 -62.7066 dB Bit-depth: 18 [18/28 18/28 18/28]
SoX -v [FACTOR]: .0003662109 -68.7279 dB Bit-depth: 18 [18/29 18/29 18/29]
SoX -v [FACTOR]: .0001831054 -74.7483 dB Bit-depth: 18 [18/30 18/30 18/30]
SoX -v [FACTOR]: .0000915527 -80.7687 dB Bit-depth: 18 [18/31 18/31 18/31]
SoX -v [FACTOR]: .0000457763 -86.7900 dB Bit-depth: 18 [18/32 18/32 18/32]
SoX -v [FACTOR]: .0000228881 -92.8104 dB Bit-depth: 17 [17/32 17/32 17/32]
 

PeriodeLytter

Hi-Fi freak
Ble medlem
26.02.2013
Innlegg
3.103
Antall liker
2.582
Ser jeg i dårlig grad fikk fram hvorfor jeg er nyskjerrig på dette i sammenheng med SoX.

Jeg ser på mulighet til å å trancode i realtime med redusert volume for å unngå at mine eldre oversampling DAC ikke får problem med intersample overs som postet om her: https://www.hifisentralen.no/forume...le-overs-in-cd-recordings.101614/post-3280263

Greia er at om fiksen bare introduserer nye feil bør man studere dette litt for å velge mellom flere onder. Som med det meste innen audio design ;)

Kommando benyttet i scriptet er sox -v [FACTOR] 'audiofil' -n stats
Resultat vil liste følgende informasjon
Kode:
             Overall     Left      Right
DC offset  -0.000000 -0.000000  0.000000
Min level  -0.999969 -0.999969 -0.999969
Max level   0.999939  0.999939  0.999939
Pk lev dB      -0.00     -0.00     -0.00
RMS lev dB    -11.93    -11.82    -12.04
RMS Pk dB      -7.28     -7.28     -7.51
RMS Tr dB       -inf      -inf      -inf
Crest factor       -      3.90      4.00
Flat factor    20.62     20.84     20.40
Pk count       3.80k     3.76k     3.84k
Bit-depth      16/16     16/16     16/16
Num samples    11.4M
Length s     257.733
Scale max   1.000000
Window s       0.050
Siden SoX internt jobber med 32-bit float vil derfor nær alle volume-resultater gitt med -v paramteret behøve 32-bit oppløsning for å minimalisere avrundingsfeil. Riktignok avslutter Leedh white paper med spørsmål om hvor viktig dette er i praksis. Men teorien om å levere data så nært bit-perfekt som mulig må nok vekte i all digital behandling av audio for hi-fi.
 

Asbjørn

Rubinmedlem
Ble medlem
26.03.2006
Innlegg
36.749
Antall liker
35.760
Sted
Vingulmǫrk
Torget vurderinger
2
Moro. Du bør også sjekke ut loudgain, som bruker en EBU R128-algoritme til å analysere og evt lagre ReplayGain som metadata i filene. Den kan også kjøres i Windows Subsystem for Linux under Windows 10.

 

PeriodeLytter

Hi-Fi freak
Ble medlem
26.02.2013
Innlegg
3.103
Antall liker
2.582
En observasjon vedrørende "ReplayGain" funksjonen i SoX.

sox 'filnavn' -n stat -v vil gi forslag om anbefalt replaygain for å oppnå 0 dBFS

Kjører jeg dette mot et antall låter oppdaget jeg at den alltid klipper
Når SoX med stats -v foreslår 1.002 og man kjører
sox -v 1.002 'filnavn' stats får man resultater som
Volume adjustment: 1.000
sox WARN dither: dither clipped 70 samples; decrease volume?
sox WARN sox: `03 - Forever Not Yours.wav' balancing clipped 83 samples; decrease volume?


Justerer jeg ned sox -v1.001 03* -n stat sier den Volume adjustment: 1.001

Slik det ser ut for meg er da 0.000 dBFS i SoX samme som klippeterksel.
Da kan en undre om dette kan høres og om det er vanlig at systemer har samme kalibrering for 0 dBFS. Jeg tror de fleste som sikter på 0dB punktet tror at dette er punktet før klipping.
 

DagT

Hi-Fi freak
Ble medlem
03.05.2013
Innlegg
2.582
Antall liker
3.185
Sted
Oslo
Etter først kommet over sjokket at man kan ta patent på et så enkelt men genialt prinsipp ble jeg nyskjerrig på om SoX kan lures til å treffe "sweet spot" med sitt -v [FACTOR] parameter
Han har ikke fått patent. Han har søkt og foreløbid ser det ikke så bra ut :cool:
Det blir nok kanskje patentert en og annen ekstra rafinert detalj, men ikke selve prinsippet.
 

PeriodeLytter

Hi-Fi freak
Ble medlem
26.02.2013
Innlegg
3.103
Antall liker
2.582
Her er komplett liste med 128 steg volumekontroll med minimum bruk av bits i SoX.

Følgende 8 faktorer er grunnlag for listen som går til -96 dB:
1.0000 .8750 .8125 .7500 .6875 .6250 .5625 .5000

Kode:
1.0000000000        0 dB   Bit-depth: 16  [16/16 16/16 16/16]
.8750000000   -1.1596 dB   Bit-depth: 19  [19/19 19/19 19/19]
.8125000000   -1.8032 dB   Bit-depth: 20  [20/20 20/20 20/20]
.7500000000   -2.4981 dB   Bit-depth: 18  [18/18 18/18 18/18]
.6875000000   -3.2538 dB   Bit-depth: 20  [20/20 20/20 20/20]
.6250000000   -4.0825 dB   Bit-depth: 19  [19/19 19/19 19/19]
.5625000000   -4.9971 dB   Bit-depth: 19  [19/20 19/20 19/20]
.5000000000   -6.0204 dB   Bit-depth: 16  [16/17 16/17 16/17]
.5000000000   -6.0204 dB   Bit-depth: 16  [16/17 16/17 16/17]
.4375000000   -7.1800 dB   Bit-depth: 19  [19/20 19/20 19/20]
.4062500000   -7.8236 dB   Bit-depth: 20  [20/21 20/21 20/21]
.3750000000   -8.5194 dB   Bit-depth: 18  [18/19 18/19 18/19]
.3437500000   -9.2751 dB   Bit-depth: 20  [20/21 20/21 20/21]
.3125000000   -10.1029 dB   Bit-depth: 19  [19/20 19/20 19/20]
.2812500000   -11.0184 dB   Bit-depth: 19  [19/21 19/21 19/21]
.2500000000   -12.0408 dB   Bit-depth: 16  [16/18 16/18 16/18]
.2500000000   -12.0408 dB   Bit-depth: 16  [16/18 16/18 16/18]
.2187500000   -13.2013 dB   Bit-depth: 19  [19/21 19/21 19/21]
.2031250000   -13.8449 dB   Bit-depth: 20  [20/22 20/22 20/22]
.1875000000   -14.5398 dB   Bit-depth: 18  [18/20 18/20 18/20]
.1718750000   -15.2955 dB   Bit-depth: 20  [20/22 20/22 20/22]
.1562500000   -16.1233 dB   Bit-depth: 19  [19/21 19/21 19/21]
.1406250000   -17.0388 dB   Bit-depth: 19  [19/22 19/22 19/22]
.1250000000   -18.0621 dB   Bit-depth: 16  [16/19 16/19 16/19]
.1250000000   -18.0621 dB   Bit-depth: 16  [16/19 16/19 16/19]
.1093750000   -19.2217 dB   Bit-depth: 19  [19/22 19/22 19/22]
.1015625000   -19.8653 dB   Bit-depth: 20  [20/23 20/23 20/23]
.0937500000   -20.5611 dB   Bit-depth: 18  [18/21 18/21 18/21]
.0859375000   -21.3168 dB   Bit-depth: 20  [20/23 20/23 20/23]
.0781250000   -22.1446 dB   Bit-depth: 19  [19/22 19/22 19/22]
.0703125000   -23.0601 dB   Bit-depth: 19  [19/23 19/23 19/23]
.0625000000   -24.0825 dB   Bit-depth: 16  [16/20 16/20 16/20]
.0625000000   -24.0825 dB   Bit-depth: 16  [16/20 16/20 16/20]
.0546875000   -25.2429 dB   Bit-depth: 19  [19/23 19/23 19/23]
.0507812500   -25.8866 dB   Bit-depth: 20  [20/24 20/24 20/24]
.0468750000   -26.5815 dB   Bit-depth: 18  [18/22 18/22 18/22]
.0429687500   -27.3372 dB   Bit-depth: 20  [20/24 20/24 20/24]
.0390625000   -28.1650 dB   Bit-depth: 19  [19/23 19/23 19/23]
.0351562500   -29.0805 dB   Bit-depth: 19  [19/24 19/24 19/24]
.0312500000   -30.1038 dB   Bit-depth: 16  [16/21 16/21 16/21]
.0312500000   -30.1038 dB   Bit-depth: 16  [16/21 16/21 16/21]
.0273437500   -31.2634 dB   Bit-depth: 19  [19/24 19/24 19/24]
.0253906250   -31.9070 dB   Bit-depth: 20  [20/25 20/25 20/25]
.0234375000   -32.6028 dB   Bit-depth: 18  [18/23 18/23 18/23]
.0214843750   -33.3585 dB   Bit-depth: 20  [20/25 20/25 20/25]
.0195312500   -34.1863 dB   Bit-depth: 19  [19/24 19/24 19/24]
.0175781250   -35.1018 dB   Bit-depth: 19  [19/25 19/25 19/25]
.0156250000   -36.1242 dB   Bit-depth: 16  [16/22 16/22 16/22]
.0156250000   -36.1242 dB   Bit-depth: 16  [16/22 16/22 16/22]
.0136718750   -37.2846 dB   Bit-depth: 19  [19/25 19/25 19/25]
.0126953125   -37.9283 dB   Bit-depth: 20  [20/26 20/26 20/26]
.0117187500   -38.6232 dB   Bit-depth: 18  [18/24 18/24 18/24]
.0107421875   -39.3789 dB   Bit-depth: 20  [20/26 20/26 20/26]
.0097656250   -40.2067 dB   Bit-depth: 19  [19/25 19/25 19/25]
.0087890625   -41.1222 dB   Bit-depth: 19  [19/26 19/26 19/26]
.0078125000   -42.1454 dB   Bit-depth: 16  [16/23 16/23 16/23]
.0078125000   -42.1454 dB   Bit-depth: 16  [16/23 16/23 16/23]
.0068359375   -43.3051 dB   Bit-depth: 19  [19/26 19/26 19/26]
.0063476562   -43.9487 dB   Bit-depth: 20  [20/27 20/27 20/27]
.0058593750   -44.6445 dB   Bit-depth: 18  [18/25 18/25 18/25]
.0053710937   -45.4002 dB   Bit-depth: 20  [20/27 20/27 20/27]
.0048828125   -46.2280 dB   Bit-depth: 19  [19/26 19/26 19/26]
.0043945312   -47.1426 dB   Bit-depth: 19  [19/27 19/27 19/27]
.0039062500   -48.1659 dB   Bit-depth: 16  [16/24 16/24 16/24]
.0039062500   -48.1659 dB   Bit-depth: 16  [16/24 16/24 16/24]
.0034179687   -49.3263 dB   Bit-depth: 19  [19/27 19/27 19/27]
.0031738281   -49.9700 dB   Bit-depth: 20  [20/28 20/28 20/28]
.0029296875   -50.6649 dB   Bit-depth: 18  [18/26 18/26 18/26]
.0026855468   -51.4206 dB   Bit-depth: 20  [20/28 20/28 20/28]
.0024414062   -52.2484 dB   Bit-depth: 19  [19/27 19/27 19/27]
.0021972656   -53.1639 dB   Bit-depth: 19  [19/28 19/28 19/28]
.0019531250   -54.1871 dB   Bit-depth: 16  [16/25 16/25 16/25]
.0019531250   -54.1871 dB   Bit-depth: 16  [16/25 16/25 16/25]
.0017089843   -55.3467 dB   Bit-depth: 19  [19/28 19/28 19/28]
.0015869140   -55.9904 dB   Bit-depth: 20  [20/29 20/29 20/29]
.0014648437   -56.6862 dB   Bit-depth: 18  [18/27 18/27 18/27]
.0013427734   -57.4419 dB   Bit-depth: 20  [20/29 20/29 20/29]
.0012207031   -58.2697 dB   Bit-depth: 19  [19/28 19/28 19/28]
.0010986328   -59.1843 dB   Bit-depth: 19  [19/29 19/29 19/29]
.0009765625   -60.2076 dB   Bit-depth: 16  [16/26 16/26 16/26]
.0009765625   -60.2076 dB   Bit-depth: 16  [16/26 16/26 16/26]
.0008544921   -61.3680 dB   Bit-depth: 19  [19/29 19/29 19/29]
.0007934570   -62.0117 dB   Bit-depth: 20  [20/30 20/30 20/30]
.0007324218   -62.7066 dB   Bit-depth: 18  [18/28 18/28 18/28]
.0006713867   -63.4623 dB   Bit-depth: 20  [20/30 20/30 20/30]
.0006103515   -64.2901 dB   Bit-depth: 19  [19/29 19/29 19/29]
.0005493164   -65.2056 dB   Bit-depth: 19  [19/30 19/30 19/30]
.0004882812   -66.2288 dB   Bit-depth: 16  [16/27 16/27 16/27]
.0004882812   -66.2288 dB   Bit-depth: 16  [16/27 16/27 16/27]
.0004272460   -67.3884 dB   Bit-depth: 19  [19/30 19/30 19/30]
.0003967285   -68.0321 dB   Bit-depth: 20  [20/31 20/31 20/31]
.0003662109   -68.7279 dB   Bit-depth: 18  [18/29 18/29 18/29]
.0003356933   -69.4836 dB   Bit-depth: 20  [20/31 20/31 20/31]
.0003051757   -70.3114 dB   Bit-depth: 19  [19/30 19/30 19/30]
.0002746582   -71.2260 dB   Bit-depth: 19  [19/31 19/31 19/31]
.0002441406   -72.2492 dB   Bit-depth: 16  [16/28 16/28 16/28]
.0002441406   -72.2492 dB   Bit-depth: 16  [16/28 16/28 16/28]
.0002136230   -73.4089 dB   Bit-depth: 19  [19/31 19/31 19/31]
.0001983642   -74.0534 dB   Bit-depth: 20  [20/32 20/32 20/32]
.0001831054   -74.7483 dB   Bit-depth: 18  [18/30 18/30 18/30]
.0001678466   -75.5040 dB   Bit-depth: 20  [20/32 20/32 20/32]
.0001525878   -76.3318 dB   Bit-depth: 19  [19/31 19/31 19/31]
.0001373291   -77.2473 dB   Bit-depth: 19  [19/32 19/32 19/32]
.0001220703   -78.2705 dB   Bit-depth: 16  [16/29 16/29 16/29]
.0001220703   -78.2705 dB   Bit-depth: 16  [16/29 16/29 16/29]
.0001068115   -79.4301 dB   Bit-depth: 19  [19/32 19/32 19/32]
.0000991821   -80.0738 dB   Bit-depth: 19  [19/32 19/32 19/32]
.0000915527   -80.7687 dB   Bit-depth: 18  [18/31 18/31 18/31]
.0000839233   -81.5252 dB   Bit-depth: 19  [19/32 19/32 19/32]
.0000762939   -82.3530 dB   Bit-depth: 19  [19/32 19/32 19/32]
.0000686645   -83.2677 dB   Bit-depth: 18  [18/32 18/32 18/32]
.0000610351   -84.2909 dB   Bit-depth: 16  [16/30 16/30 16/30]
.0000610351   -84.2909 dB   Bit-depth: 16  [16/30 16/30 16/30]
.0000534057   -85.4505 dB   Bit-depth: 18  [18/32 18/32 18/32]
.0000495910   -86.0951 dB   Bit-depth: 18  [18/32 18/32 18/32]
.0000457763   -86.7900 dB   Bit-depth: 18  [18/32 18/32 18/32]
.0000419616   -87.5457 dB   Bit-depth: 18  [18/32 18/32 18/32]
.0000381469   -88.3735 dB   Bit-depth: 18  [18/32 18/32 18/32]
.0000343322   -89.2890 dB   Bit-depth: 17  [17/32 17/32 17/32]
.0000305175   -90.3122 dB   Bit-depth: 16  [16/31 16/31 16/31]
.0000305175   -90.3122 dB   Bit-depth: 16  [16/31 16/31 16/31]
.0000267028   -91.4718 dB   Bit-depth: 17  [17/32 17/32 17/32]
.0000247955   -92.1155 dB   Bit-depth: 17  [17/32 17/32 17/32]
.0000228881   -92.8104 dB   Bit-depth: 17  [17/32 17/32 17/32]
.0000209808   -93.5669 dB   Bit-depth: 17  [17/32 17/32 17/32]
.0000190734   -94.3947 dB   Bit-depth: 17  [17/32 17/32 17/32]
.0000171661   -95.3094 dB   Bit-depth: 16  [16/32 16/32 16/32]
.0000152587   -96.3326 dB   Bit-depth: 16  [16/32 16/32 16/32]
Jeg får ikke oppdatert første post, men om noen er intressert gi en lyd så poster jeg oppdatert versjon av skriptet.
 

Asbjørn

Rubinmedlem
Ble medlem
26.03.2006
Innlegg
36.749
Antall liker
35.760
Sted
Vingulmǫrk
Torget vurderinger
2
En observasjon vedrørende "ReplayGain" funksjonen i SoX.

sox 'filnavn' -n stat -v vil giloudgainforslag om anbefalt replaygain for å oppnå 0 dBFS

Kjører jeg dette mot et antall låter oppdaget jeg at den alltid klipper
Når SoX med stats -v foreslår 1.002 og man kjører
sox -v 1.002 'filnavn' stats får man resultater som
Volume adjustment: 1.000
sox WARN dither: dither clipped 70 samples; decrease volume?
sox WARN sox: `03 - Forever Not Yours.wav' balancing clipped 83 samples; decrease volume?


Justerer jeg ned sox -v1.001 03* -n stat sier den Volume adjustment: 1.001

Slik det ser ut for meg er da 0.000 dBFS i SoX samme som klippeterksel.
Da kan en undre om dette kan høres og om det er vanlig at systemer har samme kalibrering for 0 dBFS. Jeg tror de fleste som sikter på 0dB punktet tror at dette er punktet før klipping.
Jeg sjekket med loudgain hos meg. Skrev et Python-script som gnager gjennom hele biblioteket, setter nye ReplayGain tags med EBU R128-anbefalt -23 LUFS referansenivå, og skriver en fil med oppsummering til respektive mappe. Loudgain oppsampler og rekonstruerer bølgeformen for å sjekke for intersample overs, og setter også en PEAK tag som representerer "true peak", dvs peak nivå på den rekonstruerte bølgeformen.

Interessant nok var albumet med desidert verst klipping Chris Rea's "The Very Best of Chris Rea" (1995). Hele albumet klipper. Det verste enkeltsporet i hele samlingen er "Driving Home for Christmas". Det har nesten 5 dB digital klipping slik det er mastret. Med -12 dB ReplayGain for albumet kommer det innafor, det også.

1618049744267.png


Med EBU R128-standard, -23 dB referansenivå, og i tillegg --noclip option i loudgain for å sikre minst 1 dB headroom før digital klipping ser jeg at det ikke lenger er noe som ligger an til å klippe i hele biblioteket.

 
Sist redigert:

PeriodeLytter

Hi-Fi freak
Ble medlem
26.02.2013
Innlegg
3.103
Antall liker
2.582
Har loadgain som next project :) Akkurat nå kjører et brute force script mot sox på dag 5 så jeg får ikke kjørt upgrade på et par dager enda.
Loadgain ser ut til å gi flere svar mye raskere enn jeg klarer med SoX.

Nå er jeg ikke egentlig så opptatt av replay gain for komfort. Men heller forsøke hente ut absolutt maks klippefri headrom fra filer som klipper ved intersamples over. Filer som ikke klipper ved oppsamling var egentlig planlagt å få være i fred.
 

Asbjørn

Rubinmedlem
Ble medlem
26.03.2006
Innlegg
36.749
Antall liker
35.760
Sted
Vingulmǫrk
Torget vurderinger
2
Poster like gjerne scriptet her. Det brukte ca 15 timer på å kverne gjennom 77000 musikkfiler, Xeon E4-2640 v4 (10 cores), 2,40 GHz, og 4x1 TB HDD i RAID 0. Diskene er gamle Western Digital som jeg resirkulerte etter at en NAS tok kvelden med havarert motherboard. Diskene var fortsatt brukbare (men jeg tar backup ganske ofte).

Det er også et bash- og et Python-script i loudgain distro. Det Python-scriptet ser ut til å ha mye bedre testing mot feiltilstander og user interrupts enn dette har. Dette er parallell Python3 på et minimumsnivå. Brukes eventuelt på eget ansvar, selvsagt, så ikke klag til meg om det friterer noe. :)
Kode:
#!/usr/bin/env python
# -*- coding=ascii -*-
# Script to update ReplayGain tags to EBU R128 standard
# Note: Runs under Windows 10 Linux subsystem (WSL)

from multiprocessing import Pool, cpu_count, Lock

import os
import re
import sys
import glob
import time
import subprocess

global padlock
tgtroot="/mnt/e/Music"

def init(l):
    padlock=l
# end init

def process_album(root, folder):
    curdir=os.path.join(root, folder)
    os.chdir(curdir)
    padlock.acquire()
    sys.stdout.write(curdir)
    sys.stdout.write("\n")
    sys.stdout.flush()
    padlock.release()

    tracklist=glob.glob("./*.flac")
    if len(tracklist)>0:
        outfile=open("loudgain.txt","w")
        subprocess.run(["loudgain", "--album", "--output-new", "--quiet", "--noclip", "--pregain=-5", "--tagmode=e"]+tracklist,stdout=outfile)
    # end if there are any flac files in folder
# end of album processing


if __name__ == '__main__':
    ccnt = cpu_count()
    print("Found ", ccnt, " processor cores")

    padlock = Lock()
    carpool = Pool(processes=ccnt,initializer=init,initargs=(padlock,))

    ts = time.time()
    dc = 0
    print("Updating ReplayGain values...")
    for root, dirs, files in os.walk(tgtroot):
        for folder in dirs:
                dc = dc+1
                carpool.apply_async(process_album,(root, folder,))

    carpool.close()
    carpool.join()

    print("Scanned ", dc, " directories in ",time.time()-ts," seconds")
# end of main loop
 
Sist redigert:

PeriodeLytter

Hi-Fi freak
Ble medlem
26.02.2013
Innlegg
3.103
Antall liker
2.582
Ja det kan du si. Jeg lurer på hvor mange digitale filtre som tar høyde for dette før de oppsampler? De er nok veldig bevist problemet i selve filterprosessernigen, men jeg undrer om de tar høyde for intersample overs i inngangsdelen? Benchmark hevder jo de fleste kommersielle filter/oppsampling chipper ikke tar høyde for intersample overs og baseser seg på at kilden har skalert signalet.

Forresten leste mer hvordan den loadgain saken fungerer. Hvor den ikke benytter RMS men såkalt True Peaks. Slik jeg forstår det jeg leste av kode og veiledning gjør biblioteket libebur128 2x oppsamling på medie.

Over i tråden jeg laget med resampling med SoX benytter jeg brute force hvor hele låten resamples for så lese av sample peak-count. Da fant jeg at antall samples som klipper øker med sample rate opp til og med 16x. Men jeg ser nå at SoX mulgens byr på et mer nyttig datasett, — Flat factor som teller antall klippede peaks heller enn samples. Jeg får kjøre sample rate testen på nytt og se hva denne viser.
Flat factoris a measure of the flatness (i.e. consecutive samples with the same value) of the signalat its peak levels (i.e. eitherMin level,orMax level).Pk countis the number of occasions (not thenumber of samples) that the signal attained eitherMin level,orMax level.
minn seg selv på ikke poste når kona maser. Det er Pk count som gjelder. Trykkfeil i PDF manualen er denne havnet i samme avsnitt som Flat factor uten linjeskrift.
Pk count s the number of occasions (not thenumber of samples) that the signal attained eitherMin level,orMax level.
Kode:
             Overall     Left      Right
DC offset   0.000151  0.000134  0.000151
Min level  -0.987854 -0.987579 -0.987854
Max level   0.987976  0.987488  0.987976
Pk lev dB      -0.11     -0.11     -0.11
RMS lev dB    -12.43    -12.47    -12.38
RMS Pk dB      -6.99     -7.09     -6.99
RMS Tr dB     -73.82    -73.80    -73.82
Crest factor       -      4.15      4.11
Flat factor     0.00      0.00      0.00
Pk count           2         2         2
Bit-depth      16/16     16/16     16/16
Num samples    8.11M
Length s     183.960
Scale max   1.000000
Window s       0.050
 
Sist redigert:

Asbjørn

Rubinmedlem
Ble medlem
26.03.2006
Innlegg
36.749
Antall liker
35.760
Sted
Vingulmǫrk
Torget vurderinger
2
Definisjonene av Loudness, Loudness Range og True Peak finnes i EBU-dokumenter. De er ikke helt trivielle. Eksempelvis er ikke Loudness Range det samme som dynamic range eller crest factor.

Annex 2 i BS.1770 beskriver True Peak-beregningen. Den skal oppsample til minst 192 kHz for å gi en toleranse på +/-0,3 dB ved 20 kHz. Som du har funnet ut vil estimert peak i signalet øke med høyere sampling rate. Bølgeformen er det den er, men sjansen for å treffe peak med et samplepunkt øker. Med +/-0,3 dB toleranse og 1 dBFS headroom over beregnet True Peak skulle man da ha litt sikkerhetsmargin.
For 48 kHz:
1618122941642.png

LRA is defined as the difference between the estimates of the 10th and the 95th percentiles of the distribution. The lower percentile of 10%, can, for example, prevent the fade-out of a music track from dominating Loudness Range. The upper percentile of 95% ensures that a single unusually loud sound, such as a gunshot in a movie, cannot by itself be responsible for a large Loudness Range.
For meg ser det ut til at libebur128-koden gjør 4x oppsampling også for 44,1 kHz input (og alt annet under 96 kHz). Det er strengt tatt litt i underkant etter definisjonen, men gjør vel bare at toleransen blir ca +/-0,5 dB i stedet for +/-0,3 dB. Ved 20 kHz, og det er neppe der peak ligger i et musikksignal.
Kode:
if (st->samplerate < 96000) {
    st->d->interp = interp_create(49, 4, st->channels);
    CHECK_ERROR(!st->d->interp, EBUR128_ERROR_NOMEM, exit)
  } else if (st->samplerate < 192000) {
    st->d->interp = interp_create(49, 2, st->channels);
    CHECK_ERROR(!st->d->interp, EBUR128_ERROR_NOMEM, exit)
  } else {
    st->d->resampler_buffer_input = NULL;
    st->d->resampler_buffer_output = NULL;
    st->d->interp = NULL;
    goto exit;
  }
 
Sist redigert:

PeriodeLytter

Hi-Fi freak
Ble medlem
26.02.2013
Innlegg
3.103
Antall liker
2.582
Ja, nøkkelordet ser ut til å være ekstra headroom utover det som måles.

Jeg gjennomført resampling testene på nytt for å se om intersamples over gir flere antall peaker, eller om det kun er de samme peakene med flere klippede samples. Testen nå utført med hvit frakk viser at 4x oppsampling muligens ikke er nok uten at man også legger inn margin.

Funfact. SoX gjør allerede standard hva Leedh Processor Volume's white paper anbefaler. TPDF dithering ved volume resampling for å undertrykke forvrengning ved truncating, — med amplitude 1 bit høyere enn bitene som skal bort.

Jeg begynner ane konturene av at jeg som lider litt av tvangstanker vedrørende det å resample mer enn en gang muligens får best resultat med såkalt arithmetic right shift, altså -6.02 dB. Fra testen med 16x oversampling krever jo dette alene -5.2 dB.
 

bambadoo

Æresmedlem
Moderator
Ble medlem
11.10.2002
Innlegg
22.208
Antall liker
10.763
Sted
Lørenskog
Torget vurderinger
16
Ikke fordøyd innholdet i denne tråden enda (skal gjøre det) men mener Archimago har drevet med noe av det samme mtp. tema tidligere. Kanskje noe til inspirasjon?

Og sikkert flere linker også.

Oppsampler alt i rpi med SOX jeg også men synes å erindre at jeg har dratt ned "nivået" med rundt 4dB over hele fjøla. Enkelt altså ;)
 

PeriodeLytter

Hi-Fi freak
Ble medlem
26.02.2013
Innlegg
3.103
Antall liker
2.582
Musings linker en artikkel fra TC Electronic fra 2003. Det må da vitterlig være flere enn tidligere nevnte merker som RME og Benchmark som har implementert headroom i sine DAC? Felles for disse tre er at de er produsenter. for proffmarkedet. Men konsumer og hi-end er det noen her som snakker om dette?
 

bambadoo

Æresmedlem
Moderator
Ble medlem
11.10.2002
Innlegg
22.208
Antall liker
10.763
Sted
Lørenskog
Torget vurderinger
16
Jeg gjør det i min dac der jeg kan lage digitale filtre selv. Ser jo ut som profilbildet ditt er av samme dac (teknologi)? Soekris?
 

PeriodeLytter

Hi-Fi freak
Ble medlem
26.02.2013
Innlegg
3.103
Antall liker
2.582
Har 1 generasjon. Dessverre lever de livet i kommende prosjekter-skuffen min. Kjøpte to stk som skulle bli delefilter, men så ventet vi på at Soekris skulle la oss synke dem. Som jo aldri ble noe av :(
 

bambadoo

Æresmedlem
Moderator
Ble medlem
11.10.2002
Innlegg
22.208
Antall liker
10.763
Sted
Lørenskog
Torget vurderinger
16
Nei det kommer nok ikke til å skje er jeg redd...
Tenkte det samme en periode, men lot det være. Spiller dog utmerket ellers. Har også 1. gen og gjort de modifikasjoner som var nødvendige. Bruker "audiozen" board med forskjellige psu, oled skjerm etc.. Skal visst komme i gen7 nå som er ganske oppgradert. Soekris er en flink fyr men noe "eksentrisk" og hater å innrømme "feil".
 

Asbjørn

Rubinmedlem
Ble medlem
26.03.2006
Innlegg
36.749
Antall liker
35.760
Sted
Vingulmǫrk
Torget vurderinger
2
Det er mye rart man kan gjøre med et sånt datasett. Jeg importerte hele ruklet til Excel, satte inn en pivot-tabell som tar gjennomsnitt for artist og album, og sorterte den etter fallende Loudness Range (Album Range).

Det var ingen stor overraskelse i noen av endene. Størst dynamikk er i storskala symfoniske verk, gjerne de mer "moderne" fra tidlig 20. århundre som Schönberg, Copland, Ravel, Stravinskij. I den andre enden er det bare jevn during uansett.

1618142674659.png

...

1618142753785.png
 

PeriodeLytter

Hi-Fi freak
Ble medlem
26.02.2013
Innlegg
3.103
Antall liker
2.582
Om bedre oppløsning behøves som ved f.eks. trankoding for replaygain er her en 0 til -6 dB liste med 64 factorer som alle smetter inn under 24 bit uten avrunding.

Dessverre er det ikke noe som sier at man direkte kan overføre disse faktorne til andre enheter som også benytter faktor representasjon. F.eks. 88% er samme som en faktor 0.88.

Kode:
Verifying 1040 attenuation values using SoX
1            0       dB   Bit-depth: 16  [16/16 16/16 16/16]
.9921875000   -.0677 dB   Bit-depth: 23  [23/23 23/23 23/23]
.9843750000   -.1363 dB   Bit-depth: 22  [22/22 22/22 22/22]
.9765625000   -.2058 dB   Bit-depth: 23  [23/23 23/23 23/23]
.9687500000   -.2753 dB   Bit-depth: 21  [21/21 21/21 21/21]
.9609375000   -.3457 dB   Bit-depth: 23  [23/23 23/23 23/23]
.9531250000   -.4169 dB   Bit-depth: 22  [22/22 22/22 22/22]
.9453125000   -.4881 dB   Bit-depth: 23  [23/23 23/23 23/23]
.9375000000   -.5602 dB   Bit-depth: 20  [20/20 20/20 20/20]
.9296875000   -.6332 dB   Bit-depth: 23  [23/23 23/23 23/23]
.9218750000   -.7061 dB   Bit-depth: 22  [22/22 22/22 22/22]
.9140625000   -.7800 dB   Bit-depth: 23  [23/23 23/23 23/23]
.9062500000   -.8547 dB   Bit-depth: 21  [21/21 21/21 21/21]
.8984375000   -.9294 dB   Bit-depth: 23  [23/23 23/23 23/23]
.8906250000   -1.0058 dB   Bit-depth: 22  [22/22 22/22 22/22]
.8828125000   -1.0823 dB   Bit-depth: 23  [23/23 23/23 23/23]
.8750000000   -1.1596 dB   Bit-depth: 19  [19/19 19/19 19/19]
.8671875000   -1.2377 dB   Bit-depth: 23  [23/23 23/23 23/23]
.8593750000   -1.3159 dB   Bit-depth: 22  [22/22 22/22 22/22]
.8515625000   -1.3950 dB   Bit-depth: 23  [23/23 23/23 23/23]
.8437500000   -1.4749 dB   Bit-depth: 21  [21/21 21/21 21/21]
.8359375000   -1.5565 dB   Bit-depth: 23  [23/23 23/23 23/23]
.8281250000   -1.6373 dB   Bit-depth: 22  [22/22 22/22 22/22]
.8203125000   -1.7198 dB   Bit-depth: 23  [23/23 23/23 23/23]
.8125000000   -1.8032 dB   Bit-depth: 20  [20/20 20/20 20/20]
.8046875000   -1.8875 dB   Bit-depth: 23  [23/23 23/23 23/23]
.7968750000   -1.9717 dB   Bit-depth: 22  [22/22 22/22 22/22]
.7890625000   -2.0577 dB   Bit-depth: 23  [23/23 23/23 23/23]
.7812500000   -2.1437 dB   Bit-depth: 21  [21/21 21/21 21/21]
.7734375000   -2.2314 dB   Bit-depth: 23  [23/23 23/23 23/23]
.7656250000   -2.3192 dB   Bit-depth: 22  [22/22 22/22 22/22]
.7578125000   -2.4086 dB   Bit-depth: 23  [23/23 23/23 23/23]
.7500000000   -2.4981 dB   Bit-depth: 18  [18/18 18/18 18/18]
.7421875000   -2.5893 dB   Bit-depth: 23  [23/23 23/23 23/23]
.7343750000   -2.6814 dB   Bit-depth: 22  [22/22 22/22 22/22]
.7265625000   -2.7743 dB   Bit-depth: 23  [23/23 23/23 23/23]
.7187500000   -2.8681 dB   Bit-depth: 21  [21/21 21/21 21/21]
.7109375000   -2.9628 dB   Bit-depth: 23  [23/23 23/23 23/23]
.7031250000   -3.0592 dB   Bit-depth: 22  [22/22 22/22 22/22]
.6953125000   -3.1557 dB   Bit-depth: 23  [23/23 23/23 23/23]
.6875000000   -3.2538 dB   Bit-depth: 20  [20/20 20/20 20/20]
.6796875000   -3.3537 dB   Bit-depth: 23  [23/23 23/23 23/23]
.6718750000   -3.4536 dB   Bit-depth: 22  [22/22 22/22 22/22]
.6640625000   -3.5552 dB   Bit-depth: 23  [23/23 23/23 23/23]
.6562500000   -3.6586 dB   Bit-depth: 21  [21/21 21/21 21/21]
.6484375000   -3.7619 dB   Bit-depth: 23  [23/23 23/23 23/23]
.6406250000   -3.8679 dB   Bit-depth: 22  [22/22 22/22 22/22]
.6328125000   -3.9739 dB   Bit-depth: 23  [23/23 23/23 23/23]
.6250000000   -4.0825 dB   Bit-depth: 19  [19/19 19/19 19/19]
.6171875000   -4.1910 dB   Bit-depth: 22  [22/23 22/23 22/23]
.6093750000   -4.3022 dB   Bit-depth: 21  [21/22 21/22 21/22]
.6015625000   -4.4143 dB   Bit-depth: 22  [22/23 22/23 22/23]
.5937500000   -4.5272 dB   Bit-depth: 20  [20/21 20/21 20/21]
.5859375000   -4.6427 dB   Bit-depth: 22  [22/23 22/23 22/23]
.5781250000   -4.7591 dB   Bit-depth: 21  [21/22 21/22 21/22]
.5703125000   -4.8773 dB   Bit-depth: 22  [22/23 22/23 22/23]
.5625000000   -4.9971 dB   Bit-depth: 19  [19/20 19/20 19/20]
.5546875000   -5.1187 dB   Bit-depth: 22  [22/23 22/23 22/23]
.5468750000   -5.2421 dB   Bit-depth: 21  [21/22 21/22 21/22]
.5390625000   -5.3672 dB   Bit-depth: 22  [22/23 22/23 22/23]
.5312500000   -5.4940 dB   Bit-depth: 20  [20/21 20/21 20/21]
.5234375000   -5.6225 dB   Bit-depth: 22  [22/23 22/23 22/23]
.5156250000   -5.7528 dB   Bit-depth: 21  [21/22 21/22 21/22]
.5078125000   -5.8857 dB   Bit-depth: 22  [22/23 22/23 22/23]
.5000000000   -6.0204 dB   Bit-depth: 16  [16/17 16/17 16/17]
.5000000000   -6.0204 dB   Bit-depth: 16  [16/17 16/17 16/17]
 
Sist redigert:

PeriodeLytter

Hi-Fi freak
Ble medlem
26.02.2013
Innlegg
3.103
Antall liker
2.582
Det er mye rart man kan gjøre med et sånt datasett. ...
Jeg sliter litt med at loudgain gir meg same datasett for album som for audiofilen. Noen som har sett lignende hos seg? Eller har en teori om hvorfor?

både --output og --output-new

Katalogstruktur er Artist/Year - Album/## - Title med Album taging i flac filen (som jeg antar loudgan benytter) er Album uten år.

1618474574305.png
 

marsboer

Hi-Fi freak
Ble medlem
04.04.2010
Innlegg
4.356
Antall liker
1.701
Sted
Phobos
Jeg har ikke brukt loudgain, men ut i fra scriptet lengre opp her så må du sende inn alle låtene i albumkatalogen som argumenter. Det vil si at du kjører kommandoen en gang per albumkatalog, og ikke en gang per fil. Kan det ligge noe der?
 

PeriodeLytter

Hi-Fi freak
Ble medlem
26.02.2013
Innlegg
3.103
Antall liker
2.582
Ahh takk! Ja, det er logikk i det du sier der.

Edit:
Løsningen viser seg være at loudgain tar som argument en liste med filnavn som den da behandler som et album
find "$path" -maxdepth 1 -iname "*.flac" -type f -exec loudgain --album --noclip --output-new --tagmode=e {} + >> loudgain.txt

Filene får nå riktig tag. Men dessverre er output mindre nyttig gitt at data indekseres som 'Album'. Her bør trolig litt scripting til for å endre til Albumnavn (eller sti) før neste katalog legges til slik at data får kontekst i regenearket.
 
Sist redigert:
Topp Bunn