{"id":20208,"date":"2026-09-23T20:21:51","date_gmt":"2026-09-23T18:21:51","guid":{"rendered":"https:\/\/www.lukaswojcik.com\/blog\/narzedzia\/noise-floor-meter-afftdn-setting\/"},"modified":"2026-09-23T21:54:45","modified_gmt":"2026-09-23T19:54:45","slug":"noise-floor-meter-afftdn-setting","status":"publish","type":"page","link":"https:\/\/www.lukaswojcik.com\/blog\/pl\/narzedzia\/noise-floor-meter-afftdn-setting\/","title":{"rendered":"Miernik szumu t\u0142a: pomiar szumu w dBFS i ustawienie afftdn"},"content":{"rendered":"<div class=\"lw-rt\" id=\"rt-wurzel\" style=\"background: var(--bg-panel, #1e1e24); padding: 25px; border-radius: 8px; border: 1px solid var(--border, #2a2a35);\">\n<style>\n.lw-rt { --rt-warn: #e8a33d; }\n:root[data-theme=\"light\"] .lw-rt { --rt-warn: #8f5300; }\n.lw-rt .rt-zone { border: 2px dashed var(--border, #2a2a35); border-radius: 8px; padding: 22px; text-align: center; }\n.lw-rt .rt-zone.rt-ueber { border-color: var(--accent, #2ba6df); }\n.lw-rt .rt-kacheln { display: grid; grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); gap: 10px; margin: 4px 0; }\n.lw-rt .rt-kachel { background: var(--bg-body, #14141a); border: 1px solid var(--border, #2a2a35); border-radius: 8px; padding: 11px 14px; min-width: 0; }\n.lw-rt .rt-kachel-name { font-size: 0.74rem; color: var(--text-secondary, #a0a0b0); text-transform: uppercase; letter-spacing: 0.4px; }\n.lw-rt .rt-kachel-wert { font-family: monospace; font-size: 1.4rem; font-weight: 700; color: var(--text-primary, #e8e8ee); line-height: 1.25; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }\n.lw-rt .rt-urteil { border-radius: 8px; padding: 12px 15px; margin-top: 14px; border: 1px solid var(--border, #2a2a35); background: var(--bg-body, #14141a); }\n.lw-rt .rt-urteil-kopf { font-weight: 700; color: var(--text-primary, #e8e8ee); margin-bottom: 4px; }\n.lw-rt .rt-u-lohnt .rt-urteil-kopf { color: var(--ok, #7ee787); }\n.lw-rt .rt-u-wenig .rt-urteil-kopf, .lw-rt .rt-u-brumm .rt-urteil-kopf { color: var(--rt-warn); }\n.lw-rt .rt-u-nicht .rt-urteil-kopf, .lw-rt .rt-u-offen .rt-urteil-kopf { color: var(--text-secondary, #a0a0b0); }\n.lw-rt .rt-befehl { position: relative; margin-top: 10px; }\n.lw-rt .rt-befehl pre { background: var(--bg-body, #14141a); border: 1px solid var(--border, #2a2a35); border-radius: 6px; padding: 11px 13px; margin: 0; overflow-x: auto; font-size: 0.86rem; color: var(--text-primary, #e8e8ee); white-space: pre; }\n.lw-rt .rt-tabelle { overflow-x: auto; margin-top: 6px; }\n.lw-rt table { border-collapse: collapse; width: 100%; font-size: 0.86rem; }\n.lw-rt th, .lw-rt td { text-align: left; padding: 6px 10px; border-bottom: 1px solid var(--border, #2a2a35); vertical-align: top; }\n.lw-rt th { color: var(--text-primary, #e8e8ee); white-space: nowrap; }\n.lw-rt td { color: var(--text-primary, #e8e8ee); }\n.lw-rt td.rt-wert { font-family: monospace; color: var(--text-secondary, #a0a0b0); white-space: nowrap; }\n.lw-rt td.rt-text { color: var(--text-secondary, #a0a0b0); line-height: 1.5; }\n.lw-rt .rt-h { font-weight: 700; color: var(--text-primary, #e8e8ee); font-size: 0.95rem; margin: 24px 0 8px; }\n.lw-rt .rt-klein { font-size: 0.84rem; color: var(--text-secondary, #a0a0b0); line-height: 1.55; }\n.lw-rt .rt-knopf { background: transparent; color: var(--text-secondary, #a0a0b0); border: 1px solid var(--border, #2a2a35); padding: 9px 14px; border-radius: 6px; cursor: pointer; font-size: 0.9rem; margin-top: 12px; }\n.lw-rt .rt-fehler { color: var(--fehler, #f0857a); font-size: 0.88rem; margin-top: 12px; }\n.lw-rt a { color: var(--accent, #2ba6df); }\n@media (max-width: 480px) {\n    .lw-rt .rt-kacheln { grid-template-columns: 1fr 1fr; gap: 8px; }\n    .lw-rt .rt-kachel-wert { font-size: 1.15rem; }\n    .lw-rt th, .lw-rt td { padding: 6px 5px; }\n    .lw-rt td.rt-wert { white-space: normal; }\n}\n\/* Schmal: Messwerte als gestapelte Karten, sonst wird die Bedeutungsspalte eine Wortsaeule. *\/\n@media (max-width: 600px) {\n    .lw-rt table.rt-karten thead { display: none; }\n    .lw-rt table.rt-karten tr { display: block; padding: 8px 0; border-bottom: 1px solid var(--border, #2a2a35); }\n    .lw-rt table.rt-karten td { display: block; border: none; padding: 1px 2px; }\n    .lw-rt table.rt-karten td:first-child { font-weight: 700; }\n}\n<\/style>\n<p style=\"color: var(--text-secondary, #a0a0b0); margin-bottom: 18px;\">Wyszukuje najcichsze miejsce pliku audio, mierzy tam poziom szumu t\u0142a w dBFS i podaje pasuj\u0105ce ustawienie filtra odszumiaj\u0105cego afftdn w ffmpeg, a do tego odst\u0119p od szumu i to, co przy takim odst\u0119pie mo\u017ce da\u0107 odszumianie. Plik jest odczytywany w przegl\u0105darce i nie trafia na serwer.<\/p>\n<div id=\"rt-zone\" class=\"rt-zone\">\n<p style=\"margin: 0 0 12px; color: var(--text-primary, #e8e8ee); font-weight: 700;\">Wyb\u00f3r pliku audio z pauz\u0105 lub cichym miejscem<\/p>\n<p>        <button id=\"rt-knopf\" type=\"button\" class=\"button\" style=\"background: var(--accent, #7ee787); color: var(--on-accent, #0b1114); border: none; padding: 11px 22px; border-radius: 6px; font-weight: 700; cursor: pointer;\">Wyb\u00f3r pliku<\/button><br \/>\n        <input id=\"rt-datei\" type=\"file\" accept=\"audio\/*,.wav,.wave,.aif,.aiff,.aifc,.flac,.mp3,.m4a,.ogg,.opus\" hidden><\/p>\n<p class=\"rt-klein\" style=\"margin: 12px 0 0;\">WAV i AIFF s\u0105 odczytywane pr\u00f3bka po pr\u00f3bce; FLAC, MP3, M4A, Ogg i Opus przechodz\u0105 przez dekoder przegl\u0105darki.<\/p>\n<\/p><\/div>\n<div id=\"rt-status\" class=\"rt-klein\" data-mp-mask style=\"margin-top: 12px;\" aria-live=\"polite\"><\/div>\n<div id=\"rt-fehler\" class=\"rt-fehler\" data-mp-mask hidden><\/div>\n<div id=\"rt-ausgabe\" data-mp-mask style=\"margin-top: 18px;\" aria-live=\"polite\" hidden>\n<div id=\"rt-kacheln\" class=\"rt-kacheln\"><\/div>\n<div id=\"rt-urteil\" class=\"rt-urteil\"><\/div>\n<div class=\"rt-h\">Polecenie dla ffmpeg<\/div>\n<div class=\"rt-befehl\">\n<pre id=\"rt-befehl\"><\/pre>\n<\/div>\n<p>        <button id=\"rt-kopieren\" type=\"button\" class=\"rt-knopf\">Kopiowanie wyniku<\/button><br \/>\n        <span id=\"rt-kopiert\" class=\"rt-klein\" style=\"margin-left: 10px;\"><\/span><\/p>\n<div class=\"rt-h\">Warto\u015bci pomiaru<\/div>\n<div class=\"rt-tabelle\">\n<table class=\"rt-karten\">\n<thead>\n<tr>\n<th>Wielko\u015b\u0107<\/th>\n<th>Warto\u015b\u0107<\/th>\n<th>Znaczenie<\/th>\n<\/tr>\n<\/thead>\n<tbody id=\"rt-details\"><\/tbody>\n<\/table><\/div>\n<\/p><\/div>\n<div class=\"rt-h\">Jak przebiega pomiar i co oznaczaj\u0105 warto\u015bci<\/div>\n<p class=\"rt-klein\" style=\"margin: 0 0 6px;\">Plik jest dzielony na okna po 50\u00a0ms. Najcichszy ci\u0105g o\u015bmiu kolejnych okien, 0,4\u00a0s, daje szum t\u0142a jako RMS w dBFS; okna z samych zer s\u0105 pomijane, poniewa\u017c cyfrowa cisza nie zawiera szumu.<\/p>\n<p class=\"rt-klein\" style=\"margin: 0 0 6px;\">Regulator nf w afftdn oczekuje poziomu szumu, a nie upodobania. W pomiarze do artyku\u0142u o odszumianiu najlepsze ustawienie przy siedmiu odst\u0119pach od szumu le\u017ca\u0142o od 0,4 do 1,6\u00a0dB od rzeczywistego szumu t\u0142a, a regulator redukcji szumu zmienia\u0142 wynik w ca\u0142ym swoim zakresie tylko o 1,13\u00a0dB. Polecenie ustawia wi\u0119c nf i zostawia nr na warto\u015bci domy\u015blnej.<\/p>\n<p class=\"rt-klein\" style=\"margin: 0 0 6px;\">Odst\u0119p od szumu to RMS ca\u0142ego pliku minus szum t\u0142a. Oczekiwany zysk jest interpolowany z tego samego pomiaru: 0,15\u00a0dB przy 40\u00a0dB, 1,03\u00a0dB przy 30\u00a0dB, 2,87\u00a0dB przy 20\u00a0dB i 7,42\u00a0dB przy 6\u00a0dB. Opisuje program testowy tego pomiaru, a nie ka\u017cde nagranie.<\/p>\n<p class=\"rt-klein\" style=\"margin: 0 0 6px;\">Widmo cichego miejsca pokazuje, czy szum jest szumem, czy przyd\u017awi\u0119kiem. afftdn by\u0142 mierzony wy\u0142\u0105cznie z szumem bia\u0142ym; dla winylu i szelaku ma w\u0142asne ustawienia, noise_type v i s.<\/p>\n<p style=\"font-weight: 700; color: var(--text-primary, #e8e8ee); font-size: 0.95rem; margin: 24px 0 8px;\">Artyku\u0142y na ten temat<\/p>\n<p class=\"rt-klein\" style=\"margin: 0 0 6px;\">Kt\u00f3ry regulator afftdn dzia\u0142a i od jakiego odst\u0119pu od szumu odszumianie si\u0119 op\u0142aca, mierzy artyku\u0142 \u201e<span class=\"lw-artikel-geplant\">Odszumianie w afftdn i anlmdn<\/span>\u201d.<\/p>\n<p class=\"rt-klein\" style=\"margin: 20px 0 0;\">\u0179r\u00f3d\u0142a:<br \/>\n        <a href=\"https:\/\/ffmpeg.org\/ffmpeg-filters.html\" rel=\"noopener\">ffmpeg Filters Documentation (afftdn)<\/a> \u00b7<br \/>\n        <a href=\"https:\/\/manual.audacityteam.org\/man\/noise_reduction.html\" rel=\"noopener\">Audacity: Noise Reduction<\/a>\n    <\/p>\n<p class=\"rt-klein\" style=\"font-size: 0.8rem; margin: 14px 0 0;\">Najcichsze miejsce musi by\u0107 czystym szumem, aby warto\u015b\u0107 by\u0142a poprawna; w pliku bez pauzy wci\u0105\u017c zawiera muzyk\u0119. Warto\u015bci zysku pochodz\u0105 z syntetycznego programu testowego z szumem bia\u0142ym.<\/p>\n<\/div>\n<p><script>\n(function () {\n    'use strict';\n    const T = {\"dezimal\":\",\",\"einleitung\":\"Wyszukuje najcichsze miejsce pliku audio, mierzy tam poziom szumu t\u0142a w dBFS i podaje pasuj\u0105ce ustawienie filtra odszumiaj\u0105cego afftdn w ffmpeg, a do tego odst\u0119p od szumu i to, co przy takim odst\u0119pie mo\u017ce da\u0107 odszumianie. Plik jest odczytywany w przegl\u0105darce i nie trafia na serwer.\",\"zone_titel\":\"Wyb\u00f3r pliku audio z pauz\u0105 lub cichym miejscem\",\"knopf_datei\":\"Wyb\u00f3r pliku\",\"zone_hinweis\":\"WAV i AIFF s\u0105 odczytywane pr\u00f3bka po pr\u00f3bce; FLAC, MP3, M4A, Ogg i Opus przechodz\u0105 przez dekoder przegl\u0105darki.\",\"status_lesen\":\"Odczyt pliku \u2026\",\"status_dekodieren\":\"Dekodowanie \u2026\",\"k_teppich\":\"Szum t\u0142a\",\"k_abstand\":\"Odst\u0119p od szumu\",\"k_nf\":\"afftdn nf\",\"k_gewinn\":\"Najlepszy zmierzony zysk\",\"urteil_nicht\":\"Odszumianie prawie si\u0119 nie op\u0142aca\",\"urteil_wenig\":\"Odszumianie daje niewiele\",\"urteil_lohnt\":\"Odszumianie si\u0119 op\u0142aca\",\"urteil_offen\":\"Brak r\u00f3wnomiernego szumu\",\"urteil_brumm\":\"Przyd\u017awi\u0119k zamiast szumu\",\"urteil_text_brumm\":\"W najcichszym miejscu linia przyd\u017awi\u0119ku przy {hz} wraz z wielokrotno\u015bciami niesie wi\u0119kszo\u015b\u0107 poziomu. afftdn by\u0142 mierzony wy\u0142\u0105cznie z szumem bia\u0142ym; warto\u015b\u0107 nf poni\u017cej opisuje ca\u0142y poziom tego miejsca \u0142\u0105cznie z przyd\u017awi\u0119kiem, a filtr zaporowy lub g\u00f3rnoprzepustowy dla przyd\u017awi\u0119ku ma pierwsze\u0144stwo.\",\"urteil_text_nicht\":\"Szum le\u017cy 40\u00a0dB lub wi\u0119cej poni\u017cej sygna\u0142u. W pomiarze, na kt\u00f3rym opiera si\u0119 to narz\u0119dzie, najlepsze z 23 ustawie\u0144 poprawi\u0142o wynik przy takim odst\u0119pie najwy\u017cej o {gewinn}, a afftdn ingeruje przy tym w g\u00f3r\u0119 pasma.\",\"urteil_text_wenig\":\"Przy odst\u0119pie od 30 do 40\u00a0dB najlepsze ustawienie w pomiarze da\u0142o oko\u0142o {gewinn}. Czy to jest warte ingerencji w g\u00f3r\u0119 pasma, rozstrzyga s\u0142uch.\",\"urteil_text_lohnt\":\"Mniej ni\u017c 30\u00a0dB odst\u0119pu: tutaj pomiar wykaza\u0142 przy najlepszym ustawieniu oko\u0142o {gewinn} poprawy, a to ustawienie trafia\u0142o w rzeczywisty poziom szumu.\",\"urteil_text_offen\":\"Najcichsze miejsce waha si\u0119 o 3\u00a0dB lub wi\u0119cej albo sk\u0142ada si\u0119 w du\u017cej cz\u0119\u015bci z linii tonalnych, wi\u0119c wci\u0105\u017c gra tam muzyka. Pokazana warto\u015b\u0107 to g\u00f3rna granica poziomu szumu; plik z prawdziw\u0105 pauz\u0105 daje warto\u015b\u0107 wiarygodn\u0105.\",\"h_befehl\":\"Polecenie dla ffmpeg\",\"datei_ein\":\"wejscie.wav\",\"datei_aus\":\"wyjscie.wav\",\"knopf_kopieren\":\"Kopiowanie wyniku\",\"kopiert\":\"skopiowano\",\"kopieren_fehler\":\"kopiowanie niemo\u017cliwe\",\"h_details\":\"Warto\u015bci pomiaru\",\"sp_groesse\":\"Wielko\u015b\u0107\",\"sp_wert\":\"Warto\u015b\u0107\",\"sp_bedeutung\":\"Znaczenie\",\"d_format\":\"Format\",\"b_format\":\"WAV i AIFF s\u0105 odczytywane bez zmian, pozosta\u0142e formaty pochodz\u0105 z dekodera przegl\u0105darki z w\u0142asn\u0105 cz\u0119stotliwo\u015bci\u0105 pr\u00f3bkowania.\",\"d_kanaele\":\"Kana\u0142y\",\"d_dauer\":\"Czas trwania\",\"d_rms\":\"Poziom ca\u0142ego pliku\",\"b_rms\":\"RMS ze wszystkich kana\u0142\u00f3w i ca\u0142ego czasu trwania; wzgl\u0119dem niego mierzony jest odst\u0119p od szumu.\",\"d_strecke\":\"Najcichsze miejsce\",\"b_strecke\":\"0,4\u00a0s bez cyfrowej ciszy o najni\u017cszym RMS; jego poziom to szum t\u0142a.\",\"d_spannweite\":\"Rozpi\u0119to\u015b\u0107 poziomu w tym miejscu\",\"b_gleich\":\"Poni\u017cej 3\u00a0dB w o\u015bmiu oknach po 50\u00a0ms: r\u00f3wnomierny szum.\",\"b_ungleich\":\"Co najmniej 3\u00a0dB w o\u015bmiu oknach po 50\u00a0ms: poziom nie jest r\u00f3wnomierny, w tym miejscu prawdopodobnie wci\u0105\u017c jest muzyka.\",\"d_ton\":\"Linie tonalne\",\"b_ton_gering\":\"Udzia\u0142 energii w liniach 10\u00a0dB ponad otoczeniem, od 100\u00a0Hz do 16\u00a0kHz. Niski: szum.\",\"b_ton_hoch\":\"Udzia\u0142 energii w liniach 10\u00a0dB ponad otoczeniem, od 100\u00a0Hz do 16\u00a0kHz. Od 40\u00a0% w tym miejscu wci\u0105\u017c brzmi\u0105 d\u017awi\u0119ki.\",\"d_stille\":\"Cyfrowa cisza\",\"b_stille\":\"Odcinki z samych zer nie zawieraj\u0105 szumu i zosta\u0142y pomini\u0119te.\",\"d_hoch\":\"Energia powy\u017cej 2\u00a0kHz\",\"b_hoch\":\"Udzia\u0142 energii szumu w tym miejscu powy\u017cej 2\u00a0kHz. Szum bia\u0142y przy 44,1\u00a0kHz ma tam oko\u0142o 90\u00a0%; afftdn by\u0142 mierzony z szumem bia\u0142ym.\",\"d_brumm\":\"Przyd\u017awi\u0119k\",\"wert_kein\":\"brak\",\"b_brumm_ja\":\"Linia przy tej cz\u0119stotliwo\u015bci sieci lub jej wielokrotno\u015bciach stoi co najmniej 15\u00a0dB ponad otoczeniem. Przyd\u017awi\u0119k to linia, a nie szum t\u0142a; filtr zaporowy lub g\u00f3rnoprzepustowy trafia w niego dok\u0142adniej ni\u017c szerokopasmowy filtr odszumiaj\u0105cy.\",\"b_brumm_nein\":\"\u017badna linia przy 50 lub 60\u00a0Hz ani ich wielokrotno\u015bciach nie stoi 15\u00a0dB ponad otoczeniem.\",\"d_nf\":\"nf ograniczone\",\"b_begrenzt\":\"afftdn przyjmuje nf tylko od {min} do {max}; warto\u015b\u0107 ustawiono na najbli\u017csz\u0105 granic\u0119.\",\"bericht_kopf\":\"Szum t\u0142a\",\"fehler_format\":\"Ten plik nie nale\u017cy do odczytywanych tu format\u00f3w: WAV, AIFF, FLAC, MP3, M4A, Ogg i Opus.\",\"fehler_lesen\":\"Odczyt lub dekodowanie pliku zako\u0144czy\u0142o si\u0119 b\u0142\u0119dem.\",\"fehler_kurz\":\"Plik jest kr\u00f3tszy ni\u017c 0,4\u00a0s, a wi\u0119c za kr\u00f3tki na mierzalne miejsce.\",\"fehler_stille\":\"Plik zawiera wy\u0142\u0105cznie cyfrow\u0105 cisz\u0119, wi\u0119c nie ma szumu t\u0142a do zmierzenia.\",\"fehler_keine_strecke\":\"Brak odcinka 0,4\u00a0s bez cyfrowej ciszy.\",\"h_erklaerung\":\"Jak przebiega pomiar i co oznaczaj\u0105 warto\u015bci\",\"erkl_teppich\":\"Plik jest dzielony na okna po 50\u00a0ms. Najcichszy ci\u0105g o\u015bmiu kolejnych okien, 0,4\u00a0s, daje szum t\u0142a jako RMS w dBFS; okna z samych zer s\u0105 pomijane, poniewa\u017c cyfrowa cisza nie zawiera szumu.\",\"erkl_nf\":\"Regulator nf w afftdn oczekuje poziomu szumu, a nie upodobania. W pomiarze do artyku\u0142u o odszumianiu najlepsze ustawienie przy siedmiu odst\u0119pach od szumu le\u017ca\u0142o od 0,4 do 1,6\u00a0dB od rzeczywistego szumu t\u0142a, a regulator redukcji szumu zmienia\u0142 wynik w ca\u0142ym swoim zakresie tylko o 1,13\u00a0dB. Polecenie ustawia wi\u0119c nf i zostawia nr na warto\u015bci domy\u015blnej.\",\"erkl_abstand\":\"Odst\u0119p od szumu to RMS ca\u0142ego pliku minus szum t\u0142a. Oczekiwany zysk jest interpolowany z tego samego pomiaru: 0,15\u00a0dB przy 40\u00a0dB, 1,03\u00a0dB przy 30\u00a0dB, 2,87\u00a0dB przy 20\u00a0dB i 7,42\u00a0dB przy 6\u00a0dB. Opisuje program testowy tego pomiaru, a nie ka\u017cde nagranie.\",\"erkl_art\":\"Widmo cichego miejsca pokazuje, czy szum jest szumem, czy przyd\u017awi\u0119kiem. afftdn by\u0142 mierzony wy\u0142\u0105cznie z szumem bia\u0142ym; dla winylu i szelaku ma w\u0142asne ustawienia, noise_type v i s.\",\"quellen_titel\":\"\u0179r\u00f3d\u0142a\",\"grenze\":\"Najcichsze miejsce musi by\u0107 czystym szumem, aby warto\u015b\u0107 by\u0142a poprawna; w pliku bez pauzy wci\u0105\u017c zawiera muzyk\u0119. Warto\u015bci zysku pochodz\u0105 z syntetycznego programu testowego z szumem bia\u0142ym.\",\"lesen_h\":\"Artyku\u0142y na ten temat\",\"lesen_1_vor\":\"Kt\u00f3ry regulator afftdn dzia\u0142a i od jakiego odst\u0119pu od szumu odszumianie si\u0119 op\u0142aca, mierzy artyku\u0142 \u201e\",\"lesen_1_titel\":\"Odszumianie w afftdn i anlmdn\",\"lesen_1_nach\":\"\u201d.\"};<\/p>\n<p>    \/\/ KERN-ANFANG ------------------------------------------------------------\n    var FENSTER_S = 0.05;          \/\/ Pegelfenster\n    var STRECKE_FENSTER = 8;       \/\/ leiseste Strecke: 8 Fenster = 0,4 s\n    var GLEICHMASS_DB = 3;         \/\/ Spannweite der Fenster in der Strecke, ab der Musik vermutet wird\n    var TON_GRENZE = 0.4;          \/\/ Anteil tonaler Linien, ab dem Musik vermutet wird\n    \/\/ Kalibriert an Testdateien: Rauschen 0,2-0,4 dB Spanne und 1-2 % Linien, Musik ohne\n    \/\/ Pause 5,4 dB und 74 %, Brummen 0,04 dB und 21 %. Die Spanne allein (erst 6 dB)\n    \/\/ liess Musik als Rauschen durch - der Teppich lag dann 38 dB zu hoch.\n    var NF_MIN = -80, NF_MAX = -20; \/\/ Bereich von afftdn nf in ffmpeg 7.1\n    \/\/ Beste erreichbare Aenderung des Abstands zum sauberen Original, gemessen im Artikel\n    \/\/ \"Entrauschen mit afftdn und anlmdn\" (Rauschabstand in dB -> Aenderung in dB).\n    var GEWINN = [[6, 7.42], [12, 4.75], [20, 2.87], [30, 1.03], [40, 0.15], [50, 0.04], [60, 0.04]];<\/p>\n<p>    function str(u8, o, l) { var s = ''; for (var i = 0; i < l &#038;&#038; o + i < u8.length; i++) { s += String.fromCharCode(u8[o + i]); } return s; }\n    function le16(u8, o) { return u8[o] | (u8[o + 1] << 8); }\n    function le32(u8, o) { return (u8[o] | (u8[o + 1] << 8) | (u8[o + 2] << 16)) + ((u8[o + 3] << 24) >>> 0); }\n    function be16(u8, o) { return (u8[o] << 8) | u8[o + 1]; }\n    function be32(u8, o) { return ((u8[o] << 24) >>> 0) + (u8[o + 1] << 16) + (u8[o + 2] << 8) + u8[o + 3]; }\n\n    function pcm(puffer, start, laenge, anzahl, bytes, gleit, klein) {\n        var rahmen = Math.floor(laenge \/ (bytes * anzahl)), raus = [], c, i;\n        for (c = 0; c < anzahl; c++) { raus.push(new Float32Array(rahmen)); }\n        var dv = new DataView(puffer, start, rahmen * bytes * anzahl), u8 = new Uint8Array(puffer, start, rahmen * bytes * anzahl);\n        var teiler = Math.pow(2, bytes * 8 - 1), o = 0, v;\n        for (i = 0; i < rahmen; i++) {\n            for (c = 0; c < anzahl; c++) {\n                if (gleit) { v = bytes === 4 ? dv.getFloat32(o, klein) : dv.getFloat64(o, klein); }\n                else if (bytes === 1) { v = (klein ? u8[o] - 128 : dv.getInt8(o)) \/ teiler; }\n                else if (bytes === 2) { v = dv.getInt16(o, klein) \/ teiler; }\n                else if (bytes === 3) {\n                    var w = klein ? (u8[o] | (u8[o + 1] << 8) | (u8[o + 2] << 16)) : ((u8[o] << 16) | (u8[o + 1] << 8) | u8[o + 2]);\n                    if (w &#038; 0x800000) { w -= 0x1000000; }\n                    v = w \/ teiler;\n                } else { v = dv.getInt32(o, klein) \/ teiler; }\n                raus[c][i] = v;\n                o += bytes;\n            }\n        }\n        return raus;\n    }\n\n    function wavLesen(puffer) {\n        var u8 = new Uint8Array(puffer), p = 12, fmt = null, ds64 = null;\n        while (p + 8 <= u8.length) {\n            var id = str(u8, p, 4), l = le32(u8, p + 4);\n            if (id === 'ds64' &#038;&#038; l >= 16) { ds64 = le32(u8, p + 16) + le32(u8, p + 20) * 4294967296; }\n            if (id === 'fmt ') {\n                var tag = le16(u8, p + 8);\n                if (tag === 0xFFFE && l >= 26) { tag = le16(u8, p + 32); }\n                fmt = { tag: tag, anzahl: le16(u8, p + 10), rate: le32(u8, p + 12), bits: le16(u8, p + 22) };\n            } else if (id === 'data') {\n                if (l === 0xFFFFFFFF && ds64 !== null) { l = ds64; }\n                if (!fmt || (fmt.tag !== 1 && fmt.tag !== 3)) { return null; }\n                var bytes = fmt.bits \/ 8;\n                if ([1, 2, 3, 4, 8].indexOf(bytes) === -1 || !fmt.anzahl) { return null; }\n                return { format: 'WAV', rate: fmt.rate, kanaele: pcm(puffer, p + 8, Math.min(l, u8.length - p - 8), fmt.anzahl, bytes, fmt.tag === 3, true) };\n            }\n            if (l === 0xFFFFFFFF) { break; }\n            p += 8 + l + (l & 1);\n        }\n        return null;\n    }<\/p>\n<p>    function aiffLesen(puffer, aifc) {\n        var u8 = new Uint8Array(puffer), p = 12, comm = null;\n        while (p + 8 <= u8.length) {\n            var id = str(u8, p, 4), l = be32(u8, p + 4);\n            if (id === 'COMM') {\n                var exp = be16(u8, p + 16) &#038; 0x7FFF, hi = be32(u8, p + 18), lo = be32(u8, p + 22);\n                comm = { anzahl: be16(u8, p + 8), bits: be16(u8, p + 14), rate: Math.round((hi * 4294967296 + lo) * Math.pow(2, exp - 16383 - 63)),\n                         art: aifc &#038;&#038; l >= 22 ? str(u8, p + 26, 4) : 'NONE' };\n            } else if (id === 'SSND' && comm) {\n                var versatz = be32(u8, p + 8), start = p + 16 + versatz, laenge = Math.min(l - 8 - versatz, u8.length - start);\n                var gleit = \/^(fl32|FL32|fl64|FL64)$\/.test(comm.art);\n                if (!gleit && ['NONE', 'twos', 'sowt'].indexOf(comm.art) === -1) { return null; }\n                var bytes = gleit ? (comm.art.slice(2) === '32' ? 4 : 8) : Math.ceil(comm.bits \/ 8);\n                return { format: 'AIFF', rate: comm.rate, kanaele: pcm(puffer, start, laenge, comm.anzahl, bytes, gleit, comm.art === 'sowt') };\n            }\n            p += 8 + l + (l & 1);\n        }\n        return null;\n    }<\/p>\n<p>    \/\/ Abtastrate komprimierter Formate aus dem Kopf, damit der Decoder nicht umrechnet.\n    \/\/ Rate aus dem ersten Eintrag der Box stsd (AudioSampleEntry, 16.16 bei +32 ab Eintrag). Der Kopf kann am\n    \/\/ Dateiende stehen, deshalb wird die ganze Datei durchsucht. Raten ueber 65535 Hz passen nicht in das Feld.\n    function mp4Rate(puffer) {\n        var u = new Uint8Array(puffer), i;\n        for (i = 4; i + 46 < u.length; i++) {\n            if (u[i] === 0x73 &#038;&#038; u[i + 1] === 0x74 &#038;&#038; u[i + 2] === 0x73 &#038;&#038; u[i + 3] === 0x64) {\n                var r = (u[i + 44] << 8) | u[i + 45];\n                return r >= 3000 ? r : null;\n            }\n        }\n        return null;\n    }<\/p>\n<p>    function kopfRate(puffer) {\n        var u8 = new Uint8Array(puffer, 0, Math.min(puffer.byteLength, 1 << 20)), k = str(u8, 0, 4), p = 0;\n        if (k === 'ID3' &#038;&#038; u8.length > 10) {\n            p = 10 + ((u8[6] & 0x7f) << 21 | (u8[7] &#038; 0x7f) << 14 | (u8[8] &#038; 0x7f) << 7 | (u8[9] &#038; 0x7f));\n            if (str(u8, p, 4) === 'fLaC') { k = 'fLaC'; }\n        }\n        if (k === 'fLaC') { var s = p + 8; return { format: 'FLAC', rate: (u8[s + 10] << 12) | (u8[s + 11] << 4) | (u8[s + 12] >> 4) }; }\n        if (k === 'OggS' && u8.length > 64) {\n            var d = 27 + u8[26];\n            if (str(u8, d + 1, 6) === 'vorbis') { return { format: 'Ogg Vorbis', rate: le32(u8, d + 12) }; }\n            if (str(u8, d, 8) === 'OpusHead') { return { format: 'Opus', rate: 48000 }; }\n            return { format: 'Ogg', rate: null };\n        }\n        if (str(u8, 4, 4) === 'ftyp') { return { format: 'MP4', rate: mp4Rate(puffer) }; }\n        for (var j = p; j < Math.min(u8.length - 4, p + 65536); j++) {\n            if (u8[j] !== 0xFF || (u8[j + 1] &#038; 0xE0) !== 0xE0) { continue; }\n            var version = (u8[j + 1] >> 3) & 3, schicht = (u8[j + 1] >> 1) & 3, ri = (u8[j + 2] >> 2) & 3, bri = u8[j + 2] >> 4;\n            if (version === 1 || schicht === 0 || ri === 3 || bri === 15 || bri === 0) { continue; }\n            var basis = [44100, 48000, 32000][ri];\n            return { format: 'MP3', rate: version === 3 ? basis : (version === 2 ? basis \/ 2 : basis \/ 4) };\n        }\n        return { format: null, rate: null };\n    }<\/p>\n<p>    \/\/ WAV und AIFF selbst lesen; null heisst: den Decoder des Browsers fragen.\n    function direktLesen(puffer) {\n        var u8 = new Uint8Array(puffer);\n        if (u8.length < 16) { return null; }\n        var k = str(u8, 0, 4), a = str(u8, 8, 4);\n        if ((k === 'RIFF' || k === 'RF64' || k === 'BW64') &#038;&#038; a === 'WAVE') { return wavLesen(puffer); }\n        if (k === 'FORM' &#038;&#038; (a === 'AIFF' || a === 'AIFC')) { return aiffLesen(puffer, a === 'AIFC'); }\n        return null;\n    }\n\n    function db(p) { return p > 0 ? 10 * Math.log10(p) : -Infinity; }   \/\/ aus Leistung<\/p>\n<p>    \/\/ Radix-2-FFT, in place, n Zweierpotenz\n    function fft(re, im) {\n        var n = re.length, i, j = 0, k, m, t;\n        for (i = 1; i < n; i++) {\n            var bit = n >> 1;\n            for (; j & bit; bit >>= 1) { j ^= bit; }\n            j ^= bit;\n            if (i < j) { t = re[i]; re[i] = re[j]; re[j] = t; t = im[i]; im[i] = im[j]; im[j] = t; }\n        }\n        for (m = 2; m <= n; m <<= 1) {\n            var w = -2 * Math.PI \/ m, wr = Math.cos(w), wi = Math.sin(w);\n            for (k = 0; k < n; k += m) {\n                var cr = 1, ci = 0;\n                for (j = 0; j < m \/ 2; j++) {\n                    var a = k + j, b = a + m \/ 2;\n                    var xr = re[b] * cr - im[b] * ci, xi = re[b] * ci + im[b] * cr;\n                    re[b] = re[a] - xr; im[b] = im[a] - xi; re[a] += xr; im[a] += xi;\n                    t = cr * wr - ci * wi; ci = cr * wi + ci * wr; cr = t;\n                }\n            }\n        }\n    }\n\n    \/\/ Spektrum der leisen Strecke: Hoehenanteil und Brummen bei 50\/60 Hz\n    function art(kanaele, fs, start, laenge) {\n        var n = 1;\n        while (n * 2 <= laenge) { n *= 2; }\n        if (n < 4096) { return null; }\n        var re = new Float64Array(n), im = new Float64Array(n), i, c;\n        for (i = 0; i < n; i++) {\n            var s = 0;\n            for (c = 0; c < kanaele.length; c++) { s += kanaele[c][start + i]; }\n            re[i] = s \/ kanaele.length * (0.5 - 0.5 * Math.cos(2 * Math.PI * i \/ (n - 1)));\n        }\n        fft(re, im);\n        var df = fs \/ n, gesamt = 0, hoch = 0, tief = 0, p = new Float64Array(n \/ 2);\n        for (i = 1; i < n \/ 2; i++) {\n            p[i] = re[i] * re[i] + im[i] * im[i];\n            var f = i * df;\n            if (f < 20) { continue; }\n            gesamt += p[i];\n            if (f >= 2000) { hoch += p[i]; }\n            if (f < 200) { tief += p[i]; }\n        }\n        function spitze(f0) {\n            \/\/ Leistung bei f0 und seinen ersten drei Vielfachen gegen den Median der Umgebung\n            var bester = -Infinity;\n            for (var h = 1; h <= 3; h++) {\n                var b = Math.round(f0 * h \/ df), lok = 0;\n                for (var q = b - 2; q <= b + 2; q++) { if (p[q] > lok) { lok = p[q]; } }\n                var umg = [];\n                for (var r = b - 40; r <= b + 40; r++) { if (Math.abs(r - b) > 6 && r > 0 && r < p.length) { umg.push(p[r]); } }\n                umg.sort(function (x, y) { return x - y; });\n                var med = umg[Math.floor(umg.length \/ 2)] || 0;\n                if (med > 0) { bester = Math.max(bester, 10 * Math.log10(lok \/ med)); }\n            }\n            return bester;\n        }\n        var s50 = spitze(50), s60 = spitze(60);\n        \/\/ Anteil der Energie in Linien, die 10 dB ueber dem Median ihrer Umgebung stehen\n        \/\/ (100 Hz bis 16 kHz): Rauschen hat davon kaum etwas, Musik viel.\n        var lo = Math.max(41, Math.round(100 \/ df)), hi = Math.min(p.length - 41, Math.round(16000 \/ df));\n        var ges2 = 0, ton = 0, fenster = [];\n        \/\/ Brummen besteht selbst aus Linien, ist aber gleichmaessige Stoerung und keine Musik:\n        \/\/ die Vielfachen einer erkannten Netzfrequenz bis 1 kHz zaehlen nicht mit.\n        var netz = Math.max(s50, s60) >= 15 ? (s50 >= s60 ? 50 : 60) : 0;\n        for (i = lo; i < hi; i++) {\n            if (netz &#038;&#038; i * df < 1000) {\n                var vielfach = Math.round(i * df \/ netz) * netz;\n                if (Math.abs(i * df - vielfach) <= 3 * df) { continue; }\n            }\n            fenster.length = 0;\n            for (var r2 = i - 40; r2 <= i + 40; r2++) { fenster.push(p[r2]); }\n            fenster.sort(function (x, y) { return x - y; });\n            ges2 += p[i];\n            if (p[i] > 10 * fenster[40]) { ton += p[i]; }\n        }\n        return { hoch_anteil: gesamt > 0 ? hoch \/ gesamt : 0, tief_anteil: gesamt > 0 ? tief \/ gesamt : 0,\n                 ton_anteil: ges2 > 0 ? ton \/ ges2 : 0,\n                 brumm_hz: Math.max(s50, s60) >= 15 ? (s50 >= s60 ? 50 : 60) : null, brumm_db: Math.max(s50, s60) };\n    }<\/p>\n<p>    function interpolieren(abstand) {\n        if (abstand <= GEWINN[0][0]) { return GEWINN[0][1]; }\n        for (var i = 1; i < GEWINN.length; i++) {\n            if (abstand <= GEWINN[i][0]) {\n                var a = GEWINN[i - 1], b = GEWINN[i], t = (abstand - a[0]) \/ (b[0] - a[0]);\n                return a[1] + t * (b[1] - a[1]);\n            }\n        }\n        return GEWINN[GEWINN.length - 1][1];\n    }\n\n    \/\/ Kern der Messung. kanaele: Float32Array je Kanal, fs: Abtastrate.\n    function messen(kanaele, fs) {\n        var n = kanaele[0].length, anzahl = kanaele.length, fl = Math.max(1, Math.round(FENSTER_S * fs));\n        var nf = Math.floor(n \/ fl);\n        if (nf < STRECKE_FENSTER) { return { fehler: 'kurz' }; }\n        var leistung = new Float64Array(nf), stumm = new Uint8Array(nf), gesamt = 0, i, c, k;\n        for (k = 0; k < nf; k++) {\n            var s = 0, nullen = true;\n            for (c = 0; c < anzahl; c++) {\n                var d = kanaele[c];\n                for (i = k * fl; i < (k + 1) * fl; i++) { var v = d[i]; s += v * v; if (v !== 0) { nullen = false; } }\n            }\n            leistung[k] = s \/ (fl * anzahl);\n            stumm[k] = nullen ? 1 : 0;\n            gesamt += s;\n        }\n        var rms = gesamt \/ (nf * fl * anzahl);\n        \/\/ leiseste Strecke aus STRECKE_FENSTER Fenstern ohne digitale Stille\n        var beste = -1, bestLeistung = Infinity, stilleFenster = 0;\n        for (k = 0; k < nf; k++) { stilleFenster += stumm[k]; }\n        for (k = 0; k + STRECKE_FENSTER <= nf; k++) {\n            var summe = 0, gut = true;\n            for (i = k; i < k + STRECKE_FENSTER; i++) { if (stumm[i]) { gut = false; break; } summe += leistung[i]; }\n            if (gut &#038;&#038; summe < bestLeistung) { bestLeistung = summe; beste = k; }\n        }\n        var e = { fs: fs, dauer: n \/ fs, rms_dbfs: db(rms), stille_s: stilleFenster * fl \/ fs, kanaele: anzahl };\n        if (beste < 0) { e.fehler = stilleFenster === nf ? 'stille' : 'keine_strecke'; return e; }\n        var lmin = Infinity, lmax = -Infinity;\n        for (i = beste; i < beste + STRECKE_FENSTER; i++) { lmin = Math.min(lmin, leistung[i]); lmax = Math.max(lmax, leistung[i]); }\n        e.teppich_dbfs = db(bestLeistung \/ STRECKE_FENSTER);\n        e.von_s = beste * fl \/ fs;\n        e.bis_s = (beste + STRECKE_FENSTER) * fl \/ fs;\n        e.spannweite_db = db(lmax) - db(lmin);\n        e.art = art(kanaele, fs, beste * fl, STRECKE_FENSTER * fl);\n        e.gleichmaessig = e.spannweite_db < GLEICHMASS_DB &#038;&#038; (!e.art || e.art.ton_anteil < TON_GRENZE);\n        e.abstand_db = e.rms_dbfs - e.teppich_dbfs;\n        e.nf = Math.max(NF_MIN, Math.min(NF_MAX, Math.round(e.teppich_dbfs)));\n        e.nf_begrenzt = e.nf !== Math.round(e.teppich_dbfs);\n        e.gewinn_db = interpolieren(e.abstand_db);\n        \/\/ Geurteilt wird ueber den angezeigten, auf 0,1 dB gerundeten Wert.\n        var gezeigt = Math.round(e.abstand_db * 10) \/ 10;\n        e.urteil = gezeigt >= 40 ? 'nicht' : (gezeigt >= 30 ? 'wenig' : 'lohnt');\n        \/\/ Angezeigte Stufe: ohne gleichmaessiges Rauschen offen, bei Brummen eigenes Urteil -\n        \/\/ dann stammt der Pegel der Stelle zum grossen Teil aus einer Linie, nicht aus einem Teppich.\n        e.stufe = !e.gleichmaessig ? 'offen' : (e.art && e.art.brumm_hz ? 'brumm' : e.urteil);\n        return e;\n    }<\/p>\n<p>    function befehl(e) {\n        return 'ffmpeg -i eingang.wav -af \"afftdn=nf=' + e.nf + '\" ausgang.wav';\n    }\n    \/\/ KERN-ENDE --------------------------------------------------------------<\/p>\n<p>    function el(id) { return document.getElementById(id); }\n    var NB = '\u00a0';\n    function satz(k, w) { return (T[k] || '').replace(\/\\{(\\w+)\\}\/g, function (_, x) { return w && w[x] !== undefined ? w[x] : ''; }); }\n    function zahl(v, st) {\n        if (v === -Infinity) { return '\u2212\u221e'; }\n        if (v === null || v === undefined || !isFinite(v)) { return '\u2013'; }\n        var s = Number(v).toFixed(st === undefined ? 1 : st);\n        if (\/^-0(\\.0+)?$\/.test(s)) { s = s.slice(1); }\n        s = s.replace('-', '\u2212');\n        return T.dezimal === ',' ? s.replace('.', ',') : s;\n    }\n    function zeit(s) {\n        var m = Math.floor(s \/ 60), r = s - 60 * m;\n        return m + ':' + (r < 10 ? '0' : '') + zahl(r, 2);\n    }\n    function befehlText(e) { return befehl(e).replace('eingang.wav', T.datei_ein).replace('ausgang.wav', T.datei_aus); }\n\n    function kachel(name, wert) {\n        var d = document.createElement('div'); d.className = 'rt-kachel';\n        var a = document.createElement('div'); a.className = 'rt-kachel-name'; a.textContent = name;\n        var b = document.createElement('div'); b.className = 'rt-kachel-wert'; b.textContent = wert;\n        d.appendChild(a); d.appendChild(b);\n        return d;\n    }\n\n    function zeilen(e, info) {\n        var z = [];\n        z.push([T.d_format, (info.format || '\u2013') + ', ' + zahl(e.fs \/ 1000, e.fs % 1000 ? 1 : 0) + NB + 'kHz', T.b_format]);\n        z.push([T.d_kanaele, String(e.kanaele), '']);\n        z.push([T.d_dauer, zeit(e.dauer), '']);\n        z.push([T.d_rms, zahl(e.rms_dbfs, 1) + NB + 'dBFS', T.b_rms]);\n        z.push([T.d_strecke, zeit(e.von_s) + ' \u2013 ' + zeit(e.bis_s), T.b_strecke]);\n        z.push([T.d_spannweite, zahl(e.spannweite_db, 1) + NB + 'dB', e.gleichmaessig ? T.b_gleich : T.b_ungleich]);\n        if (e.stille_s > 0) { z.push([T.d_stille, zahl(e.stille_s, 2) + NB + 's', T.b_stille]); }\n        if (e.art) {\n            z.push([T.d_ton, zahl(e.art.ton_anteil * 100, 0) + NB + '%', e.art.ton_anteil < TON_GRENZE ? T.b_ton_gering : T.b_ton_hoch]);\n            z.push([T.d_hoch, zahl(e.art.hoch_anteil * 100, 0) + NB + '%', T.b_hoch]);\n            z.push([T.d_brumm, e.art.brumm_hz ? e.art.brumm_hz + NB + 'Hz, ' + zahl(e.art.brumm_db, 0) + NB + 'dB' : T.wert_kein,\n                    e.art.brumm_hz ? T.b_brumm_ja : T.b_brumm_nein]);\n        }\n        if (e.nf_begrenzt) { z.push([T.d_nf, String(e.nf), satz('b_begrenzt', { min: NF_MIN, max: NF_MAX })]); }\n        return z;\n    }\n\n    function bericht(r) {\n        var e = r.e, zz = [T.bericht_kopf + ': ' + (r.name || '')];\n        zz.push(T.k_teppich + ': ' + zahl(e.teppich_dbfs, 1) + ' dBFS');\n        zz.push(T.k_abstand + ': ' + zahl(e.abstand_db, 1) + ' dB');\n        zz.push(T.k_nf + ': ' + e.nf);\n        zz.push(T['urteil_' + e.stufe]);\n        zz.push(befehlText(e));\n        zeilen(e, r.info).forEach(function (x) { zz.push(x[0] + ': ' + x[1]); });\n        return zz.join('\\n');\n    }\n\n    function darstellen(r) {\n        var e = r.e;\n        if (!el('rt-kacheln')) { return r; }\n        var k = el('rt-kacheln');\n        k.textContent = '';\n        k.appendChild(kachel(T.k_teppich, zahl(e.teppich_dbfs, 1) + NB + 'dBFS'));\n        k.appendChild(kachel(T.k_abstand, zahl(e.abstand_db, 1) + NB + 'dB'));\n        k.appendChild(kachel(T.k_nf, String(e.nf)));\n        k.appendChild(kachel(T.k_gewinn, zahl(-e.gewinn_db, 2) + NB + 'dB'));\n        var u = el('rt-urteil');\n        u.className = 'rt-urteil rt-u-' + e.stufe;\n        u.textContent = '';\n        var kopf = document.createElement('div'); kopf.className = 'rt-urteil-kopf';\n        kopf.textContent = T['urteil_' + e.stufe];\n        var txt = document.createElement('div'); txt.className = 'rt-klein';\n        txt.textContent = satz('urteil_text_' + e.stufe, { gewinn: zahl(e.gewinn_db, 2) + NB + 'dB', hz: e.art &#038;&#038; e.art.brumm_hz ? e.art.brumm_hz + NB + 'Hz' : '' });\n        u.appendChild(kopf); u.appendChild(txt);\n        el('rt-befehl').textContent = befehlText(e);\n        var t = el('rt-details');\n        t.textContent = '';\n        zeilen(e, r.info).forEach(function (z) {\n            var tr = document.createElement('tr');\n            z.forEach(function (w, i) {\n                var td = document.createElement('td');\n                if (i === 1) { td.className = 'rt-wert'; } else if (i === 2) { td.className = 'rt-text'; }\n                td.textContent = w; tr.appendChild(td);\n            });\n            t.appendChild(tr);\n        });\n        el('rt-ausgabe').hidden = false;\n        el('rt-fehler').hidden = true;\n        return r;\n    }\n\n    function fehlerZeigen(s) {\n        var f = el('rt-fehler');\n        if (!f) { return; }\n        f.textContent = s; f.hidden = false;\n        el('rt-ausgabe').hidden = true;\n        el('rt-status').textContent = '';\n    }\n\n    function dekodieren(puffer, rate) {\n        return new Promise(function (ok, schlecht) {\n            var Ctx = window.OfflineAudioContext || window.webkitOfflineAudioContext;\n            if (!Ctx) { schlecht(new Error('webaudio')); return; }\n            var ctx, fertig = false;\n            try { ctx = new Ctx(1, 1, rate); } catch (x) { ctx = new Ctx(1, 1, 48000); }\n            function gut(b) { if (!fertig) { fertig = true; ok(b); } }\n            function nein(x) { if (!fertig) { fertig = true; schlecht(x || new Error('dekodieren')); } }\n            setTimeout(function () { nein(new Error('zeit')); }, 60000);\n            try { var p = ctx.decodeAudioData(puffer, gut, nein); if (p &#038;&#038; p.then) { p.then(gut, nein); } } catch (x) { nein(x); }\n        });\n    }\n\n    var letztes = null;\n    function verarbeiten(puffer, name) {\n        var info = null;\n        try { info = direktLesen(puffer); } catch (x) { info = null; }\n        var weg;\n        if (info) { weg = Promise.resolve(info); }\n        else {\n            var kopf = kopfRate(puffer);\n            if (!kopf.format) { fehlerZeigen(T.fehler_format); return Promise.resolve(null); }\n            if (el('rt-status')) { el('rt-status').textContent = T.status_dekodieren; }\n            var rate = kopf.rate &#038;&#038; kopf.rate >= 3000 && kopf.rate <= 768000 ? kopf.rate : 48000;\n            weg = dekodieren(puffer.slice(0), rate).then(function (b) {\n                var k = [];\n                for (var c = 0; c < b.numberOfChannels; c++) { k.push(b.getChannelData(c)); }\n                return { format: kopf.format, rate: b.sampleRate, kanaele: k };\n            });\n        }\n        return weg.then(function (inf) {\n            var e = messen(inf.kanaele, inf.rate);\n            if (el('rt-status')) { el('rt-status').textContent = ''; }\n            if (e.fehler) { fehlerZeigen(T['fehler_' + e.fehler]); return null; }\n            letztes = { name: name || '', info: inf, e: e };\n            return darstellen(letztes);\n        }, function () { fehlerZeigen(T.fehler_lesen); return null; });\n    }\n\n    function dateiNehmen(datei) {\n        if (!datei) { return; }\n        var leser = new FileReader();\n        el('rt-status').textContent = T.status_lesen;\n        leser.onload = function () { verarbeiten(leser.result, datei.name); };\n        leser.onerror = function () { fehlerZeigen(T.fehler_lesen); };\n        try { leser.readAsArrayBuffer(datei); } catch (x) { fehlerZeigen(T.fehler_lesen); }\n    }\n\n    window.LW_TEST = window.LW_TEST || {};\n    window.LW_TEST.RT = { T: T, messen: messen, direktLesen: direktLesen, kopfRate: kopfRate, interpolieren: interpolieren,\n        befehl: befehl, befehlText: befehlText, verarbeiten: verarbeiten, bericht: bericht, zahl: zahl, fft: fft,\n        letztes: function () { return letztes; } };\n\n    var zone = el('rt-zone'), eingabe = el('rt-datei'), knopf = el('rt-knopf');\n    if (!zone || !eingabe || !knopf) { return; }\n    knopf.addEventListener('click', function () { eingabe.click(); });\n    eingabe.addEventListener('change', function () { dateiNehmen(eingabe.files &#038;&#038; eingabe.files[0]); eingabe.value = ''; });\n    ['dragenter', 'dragover'].forEach(function (t) { zone.addEventListener(t, function (ev) { ev.preventDefault(); zone.classList.add('rt-ueber'); }); });\n    ['dragleave', 'drop'].forEach(function (t) { zone.addEventListener(t, function (ev) { ev.preventDefault(); zone.classList.remove('rt-ueber'); }); });\n    zone.addEventListener('drop', function (ev) { ev.preventDefault(); dateiNehmen(ev.dataTransfer &#038;&#038; ev.dataTransfer.files &#038;&#038; ev.dataTransfer.files[0]); });\n    var kop = el('rt-kopieren'), kopiert = el('rt-kopiert');\n    if (kop) {\n        kop.addEventListener('click', function () {\n            if (!letztes) { return; }\n            var t = bericht(letztes);\n            if (navigator.clipboard &#038;&#038; navigator.clipboard.writeText) {\n                navigator.clipboard.writeText(t).then(function () { kopiert.textContent = T.kopiert; }, function () { kopiert.textContent = T.kopieren_fehler; });\n            } else { kopiert.textContent = T.kopieren_fehler; }\n        });\n    }\n})();\n<\/script><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Wyszukuje najcichsze miejsce pliku audio i mierzy tam szum t\u0142a w dBFS, czyli warto\u015b\u0107, kt\u00f3rej oczekuje regulator nf filtra afftdn w ffmpeg. Do tego odst\u0119p od szumu, co odszumianie da\u0142o przy takim odst\u0119pie w pomiarze, czy to szum, czy przyd\u017awi\u0119k, oraz gotowe polecenie ffmpeg.<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":9284,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"template-tool-base.php","meta":{"footnotes":""},"tags":[92906],"class_list":["post-20208","page","type-page","status-publish","hentry","tag-music-production-pl"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.1 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Miernik szumu t\u0142a: pomiar szumu w dBFS i ustawienie afftdn - Lukas Wojcik - Blog<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.lukaswojcik.com\/blog\/pl\/narzedzia\/noise-floor-meter-afftdn-setting\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Miernik szumu t\u0142a: pomiar szumu w dBFS i ustawienie afftdn - Lukas Wojcik - Blog\" \/>\n<meta property=\"og:description\" content=\"Wyszukuje najcichsze miejsce pliku audio i mierzy tam szum t\u0142a w dBFS, czyli warto\u015b\u0107, kt\u00f3rej oczekuje regulator nf filtra afftdn w ffmpeg. Do tego odst\u0119p od szumu, co odszumianie da\u0142o przy takim odst\u0119pie w pomiarze, czy to szum, czy przyd\u017awi\u0119k, oraz gotowe polecenie ffmpeg.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.lukaswojcik.com\/blog\/pl\/narzedzia\/noise-floor-meter-afftdn-setting\/\" \/>\n<meta property=\"og:site_name\" content=\"Lukas Wojcik - Blog\" \/>\n<meta property=\"article:modified_time\" content=\"2026-09-23T19:54:45+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/08\/og-default.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"630\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"2 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/narzedzia\\\/noise-floor-meter-afftdn-setting\\\/\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/narzedzia\\\/noise-floor-meter-afftdn-setting\\\/\",\"name\":\"Miernik szumu t\u0142a: pomiar szumu w dBFS i ustawienie afftdn - Lukas Wojcik - Blog\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#website\"},\"datePublished\":\"2026-09-23T18:21:51+00:00\",\"dateModified\":\"2026-09-23T19:54:45+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/narzedzia\\\/noise-floor-meter-afftdn-setting\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/narzedzia\\\/noise-floor-meter-afftdn-setting\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/narzedzia\\\/noise-floor-meter-afftdn-setting\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Toolbox\",\"item\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/toolbox-3\\\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Miernik szumu t\u0142a: pomiar szumu w dBFS i ustawienie afftdn\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/\",\"name\":\"Lukas Wojcik - Blog\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\",\"name\":\"Lukas Wojcik\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"contentUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"width\":424,\"height\":636,\"caption\":\"Lukas Wojcik\"},\"logo\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\"},\"sameAs\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Miernik szumu t\u0142a: pomiar szumu w dBFS i ustawienie afftdn - Lukas Wojcik - Blog","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.lukaswojcik.com\/blog\/pl\/narzedzia\/noise-floor-meter-afftdn-setting\/","og_locale":"en_US","og_type":"article","og_title":"Miernik szumu t\u0142a: pomiar szumu w dBFS i ustawienie afftdn - Lukas Wojcik - Blog","og_description":"Wyszukuje najcichsze miejsce pliku audio i mierzy tam szum t\u0142a w dBFS, czyli warto\u015b\u0107, kt\u00f3rej oczekuje regulator nf filtra afftdn w ffmpeg. Do tego odst\u0119p od szumu, co odszumianie da\u0142o przy takim odst\u0119pie w pomiarze, czy to szum, czy przyd\u017awi\u0119k, oraz gotowe polecenie ffmpeg.","og_url":"https:\/\/www.lukaswojcik.com\/blog\/pl\/narzedzia\/noise-floor-meter-afftdn-setting\/","og_site_name":"Lukas Wojcik - Blog","article_modified_time":"2026-09-23T19:54:45+00:00","og_image":[{"width":1200,"height":630,"url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/08\/og-default.jpg","type":"image\/jpeg"}],"twitter_card":"summary_large_image","twitter_misc":{"Est. reading time":"2 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/narzedzia\/noise-floor-meter-afftdn-setting\/","url":"https:\/\/www.lukaswojcik.com\/blog\/pl\/narzedzia\/noise-floor-meter-afftdn-setting\/","name":"Miernik szumu t\u0142a: pomiar szumu w dBFS i ustawienie afftdn - Lukas Wojcik - Blog","isPartOf":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#website"},"datePublished":"2026-09-23T18:21:51+00:00","dateModified":"2026-09-23T19:54:45+00:00","breadcrumb":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/narzedzia\/noise-floor-meter-afftdn-setting\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.lukaswojcik.com\/blog\/pl\/narzedzia\/noise-floor-meter-afftdn-setting\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/narzedzia\/noise-floor-meter-afftdn-setting\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.lukaswojcik.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Toolbox","item":"https:\/\/www.lukaswojcik.com\/blog\/toolbox-3\/"},{"@type":"ListItem","position":3,"name":"Miernik szumu t\u0142a: pomiar szumu w dBFS i ustawienie afftdn"}]},{"@type":"WebSite","@id":"https:\/\/www.lukaswojcik.com\/blog\/#website","url":"https:\/\/www.lukaswojcik.com\/blog\/","name":"Lukas Wojcik - Blog","description":"","publisher":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.lukaswojcik.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":["Person","Organization"],"@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9","name":"Lukas Wojcik","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","contentUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","width":424,"height":636,"caption":"Lukas Wojcik"},"logo":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg"},"sameAs":["https:\/\/www.lukaswojcik.com\/blog"]}]}},"_links":{"self":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/pages\/20208","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/comments?post=20208"}],"version-history":[{"count":4,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/pages\/20208\/revisions"}],"predecessor-version":[{"id":20300,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/pages\/20208\/revisions\/20300"}],"up":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/pages\/9284"}],"wp:attachment":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/media?parent=20208"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/tags?post=20208"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}