{"id":20207,"date":"2026-09-23T20:21:47","date_gmt":"2026-09-23T18:21:47","guid":{"rendered":"https:\/\/www.lukaswojcik.com\/blog\/werkzeuge\/noise-floor-meter-afftdn-setting\/"},"modified":"2026-09-23T21:54:41","modified_gmt":"2026-09-23T19:54:41","slug":"noise-floor-meter-afftdn-setting","status":"publish","type":"page","link":"https:\/\/www.lukaswojcik.com\/blog\/de\/werkzeuge\/noise-floor-meter-afftdn-setting\/","title":{"rendered":"Rauschteppich-Messer: Rauschteppich in dBFS messen und die afftdn-Einstellung ablesen"},"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;\">Sucht die leiseste Stelle einer Audiodatei, misst dort den Rauschteppich in dBFS und nennt die passende Einstellung f\u00fcr den Entrauscher afftdn von ffmpeg, dazu den Rauschabstand und was Entrauschen bei diesem Abstand bringen kann. Die Datei wird im Browser gelesen und nicht hochgeladen.<\/p>\n<div id=\"rt-zone\" class=\"rt-zone\">\n<p style=\"margin: 0 0 12px; color: var(--text-primary, #e8e8ee); font-weight: 700;\">Audiodatei mit Pause oder leiser Stelle ausw\u00e4hlen<\/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;\">Datei w\u00e4hlen<\/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 und AIFF werden Wert f\u00fcr Wert gelesen; FLAC, MP3, M4A, Ogg und Opus laufen \u00fcber den Decoder des Browsers.<\/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\">Befehl f\u00fcr 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\">Ergebnis kopieren<\/button><br \/>\n        <span id=\"rt-kopiert\" class=\"rt-klein\" style=\"margin-left: 10px;\"><\/span><\/p>\n<div class=\"rt-h\">Messwerte<\/div>\n<div class=\"rt-tabelle\">\n<table class=\"rt-karten\">\n<thead>\n<tr>\n<th>Gr\u00f6\u00dfe<\/th>\n<th>Wert<\/th>\n<th>Bedeutung<\/th>\n<\/tr>\n<\/thead>\n<tbody id=\"rt-details\"><\/tbody>\n<\/table><\/div>\n<\/p><\/div>\n<div class=\"rt-h\">Wie gemessen wird und was die Werte bedeuten<\/div>\n<p class=\"rt-klein\" style=\"margin: 0 0 6px;\">Die Datei wird in Fenster von 50\u00a0ms geteilt. Die leiseste Folge aus acht aufeinanderfolgenden Fenstern, 0,4\u00a0s, liefert den Rauschteppich als RMS in dBFS; Fenster aus exakten Nullen werden \u00fcbersprungen, weil digitale Stille kein Rauschen enth\u00e4lt.<\/p>\n<p class=\"rt-klein\" style=\"margin: 0 0 6px;\">Der Regler nf von afftdn will den Pegel des Rauschens wissen, keine Vorliebe. In der Messung zum Artikel \u00fcber das Entrauschen lag die beste Einstellung \u00fcber sieben Rauschabst\u00e4nde 0,4 bis 1,6\u00a0dB am tats\u00e4chlichen Rauschteppich, w\u00e4hrend der Regler f\u00fcr die Rauschminderung \u00fcber seinen ganzen Bereich nur 1,13\u00a0dB \u00e4nderte. Der Befehl setzt deshalb nf und l\u00e4sst nr auf der Vorgabe.<\/p>\n<p class=\"rt-klein\" style=\"margin: 0 0 6px;\">Der Rauschabstand ist der RMS der ganzen Datei minus Rauschteppich. Der erwartbare Gewinn ist aus derselben Messung interpoliert: 0,15\u00a0dB bei 40\u00a0dB, 1,03\u00a0dB bei 30\u00a0dB, 2,87\u00a0dB bei 20\u00a0dB und 7,42\u00a0dB bei 6\u00a0dB. Er beschreibt das Testprogramm dieser Messung, nicht jede Aufnahme.<\/p>\n<p class=\"rt-klein\" style=\"margin: 0 0 6px;\">Ein Spektrum der leisen Stelle zeigt, ob das Rauschen Rauschen ist oder Brummen. afftdn wurde nur mit wei\u00dfem Rauschen gemessen; f\u00fcr Vinyl und Schellack hat es eigene Vorgaben, noise_type v und s.<\/p>\n<p style=\"font-weight: 700; color: var(--text-primary, #e8e8ee); font-size: 0.95rem; margin: 24px 0 8px;\">Artikel dazu<\/p>\n<p class=\"rt-klein\" style=\"margin: 0 0 6px;\">Welcher Regler von afftdn wirkt und ab welchem Rauschabstand sich Entrauschen lohnt, misst der Artikel \u201e<span class=\"lw-artikel-geplant\">Entrauschen mit afftdn und anlmdn<\/span>\u201c.<\/p>\n<p class=\"rt-klein\" style=\"margin: 20px 0 0;\">Quellen:<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;\">Die leiseste Stelle muss reines Rauschen sein, damit der Wert stimmt; in einer Datei ohne Pause enth\u00e4lt sie noch Musik. Die Gewinnwerte stammen aus einem synthetischen Testprogramm mit wei\u00dfem Rauschen.<\/p>\n<\/div>\n<p><script>\n(function () {\n    'use strict';\n    const T = {\"dezimal\":\",\",\"einleitung\":\"Sucht die leiseste Stelle einer Audiodatei, misst dort den Rauschteppich in dBFS und nennt die passende Einstellung f\u00fcr den Entrauscher afftdn von ffmpeg, dazu den Rauschabstand und was Entrauschen bei diesem Abstand bringen kann. Die Datei wird im Browser gelesen und nicht hochgeladen.\",\"zone_titel\":\"Audiodatei mit Pause oder leiser Stelle ausw\u00e4hlen\",\"knopf_datei\":\"Datei w\u00e4hlen\",\"zone_hinweis\":\"WAV und AIFF werden Wert f\u00fcr Wert gelesen; FLAC, MP3, M4A, Ogg und Opus laufen \u00fcber den Decoder des Browsers.\",\"status_lesen\":\"Datei wird gelesen \u2026\",\"status_dekodieren\":\"Wird dekodiert \u2026\",\"k_teppich\":\"Rauschteppich\",\"k_abstand\":\"Rauschabstand\",\"k_nf\":\"afftdn nf\",\"k_gewinn\":\"Bester Gewinn gemessen\",\"urteil_nicht\":\"Entrauschen lohnt kaum\",\"urteil_wenig\":\"Entrauschen bringt wenig\",\"urteil_lohnt\":\"Entrauschen lohnt\",\"urteil_offen\":\"Kein gleichm\u00e4\u00dfiges Rauschen gefunden\",\"urteil_brumm\":\"Brummen statt Rauschen\",\"urteil_text_brumm\":\"An der leisesten Stelle tr\u00e4gt eine Brummlinie bei {hz} samt Vielfachen den gr\u00f6\u00dften Teil des Pegels. afftdn wurde nur mit wei\u00dfem Rauschen gemessen; der nf-Wert unten beschreibt den ganzen Pegel der Stelle einschlie\u00dflich des Brummens, und ein Kerb- oder Hochpassfilter f\u00fcr das Brummen kommt zuerst.\",\"urteil_text_nicht\":\"Das Rauschen liegt 40\u00a0dB oder mehr unter dem Signal. In der Messung hinter diesem Werkzeug verbesserte die beste von 23 Einstellungen das Ergebnis bei diesem Abstand um h\u00f6chstens {gewinn}, w\u00e4hrend afftdn im Hochton eingreift.\",\"urteil_text_wenig\":\"Bei 30 bis 40\u00a0dB Rauschabstand brachte die beste Einstellung in der Messung etwa {gewinn}. Ob das einen Eingriff im Hochton wert ist, entscheidet das Geh\u00f6r.\",\"urteil_text_lohnt\":\"Weniger als 30\u00a0dB Rauschabstand: Hier fand die Messung mit der besten Einstellung etwa {gewinn} Verbesserung, und diese Einstellung traf den tats\u00e4chlichen Rauschteppich.\",\"urteil_text_offen\":\"Die leiseste Stelle schwankt um 3\u00a0dB oder mehr im Pegel oder besteht zu einem gro\u00dfen Teil aus tonalen Linien, dort spielt also noch Musik. Der angezeigte Wert ist eine Obergrenze f\u00fcr den Rauschteppich; eine Datei mit echter Pause liefert einen belastbaren.\",\"h_befehl\":\"Befehl f\u00fcr ffmpeg\",\"datei_ein\":\"eingang.wav\",\"datei_aus\":\"ausgang.wav\",\"knopf_kopieren\":\"Ergebnis kopieren\",\"kopiert\":\"kopiert\",\"kopieren_fehler\":\"Kopieren nicht m\u00f6glich\",\"h_details\":\"Messwerte\",\"sp_groesse\":\"Gr\u00f6\u00dfe\",\"sp_wert\":\"Wert\",\"sp_bedeutung\":\"Bedeutung\",\"d_format\":\"Format\",\"b_format\":\"WAV und AIFF werden unver\u00e4ndert gelesen, andere Formate kommen aus dem Decoder des Browsers mit ihrer eigenen Abtastrate.\",\"d_kanaele\":\"Kan\u00e4le\",\"d_dauer\":\"Dauer\",\"d_rms\":\"Pegel der ganzen Datei\",\"b_rms\":\"RMS \u00fcber alle Kan\u00e4le und die ganze Dauer; daran wird der Rauschabstand gemessen.\",\"d_strecke\":\"Leiseste Stelle\",\"b_strecke\":\"Die 0,4\u00a0s ohne digitale Stille mit dem niedrigsten RMS; ihr Pegel ist der Rauschteppich.\",\"d_spannweite\":\"Pegelspanne an der Stelle\",\"b_gleich\":\"Unter 3\u00a0dB \u00fcber acht Fenster von 50\u00a0ms: gleichm\u00e4\u00dfiges Rauschen.\",\"b_ungleich\":\"Mindestens 3\u00a0dB \u00fcber acht Fenster von 50\u00a0ms: Der Pegel ist nicht gleichm\u00e4\u00dfig, an der Stelle steht vermutlich noch Musik.\",\"d_ton\":\"Tonale Linien\",\"b_ton_gering\":\"Anteil der Energie in Linien, die 10\u00a0dB \u00fcber ihrer Umgebung stehen, 100\u00a0Hz bis 16\u00a0kHz. Gering: Rauschen.\",\"b_ton_hoch\":\"Anteil der Energie in Linien, die 10\u00a0dB \u00fcber ihrer Umgebung stehen, 100\u00a0Hz bis 16\u00a0kHz. Ab 40\u00a0% klingen an der Stelle noch T\u00f6ne.\",\"d_stille\":\"Digitale Stille\",\"b_stille\":\"Strecken aus exakten Nullen enthalten kein Rauschen und wurden \u00fcbersprungen.\",\"d_hoch\":\"Energie \u00fcber 2\u00a0kHz\",\"b_hoch\":\"Anteil der Rauschenergie an der Stelle oberhalb von 2\u00a0kHz. Wei\u00dfes Rauschen legt bei 44,1\u00a0kHz etwa 90\u00a0% dorthin; afftdn wurde mit wei\u00dfem Rauschen gemessen.\",\"d_brumm\":\"Brummen\",\"wert_kein\":\"keines\",\"b_brumm_ja\":\"Eine Linie bei dieser Netzfrequenz oder ihren Vielfachen steht mindestens 15\u00a0dB \u00fcber ihrer Umgebung. Brummen ist eine Linie und kein Teppich; ein Kerb- oder Hochpassfilter trifft es genauer als ein breitbandiger Entrauscher.\",\"b_brumm_nein\":\"Keine Linie bei 50 oder 60\u00a0Hz oder ihren Vielfachen steht 15\u00a0dB \u00fcber ihrer Umgebung.\",\"d_nf\":\"nf begrenzt\",\"b_begrenzt\":\"afftdn nimmt nf nur zwischen {min} und {max}; der Wert wurde auf die n\u00e4chste Grenze gesetzt.\",\"bericht_kopf\":\"Rauschteppich\",\"fehler_format\":\"Diese Datei geh\u00f6rt zu keinem der hier gelesenen Formate: WAV, AIFF, FLAC, MP3, M4A, Ogg oder Opus.\",\"fehler_lesen\":\"Die Datei lie\u00df sich nicht lesen oder dekodieren.\",\"fehler_kurz\":\"Die Datei ist k\u00fcrzer als 0,4\u00a0s und damit zu kurz f\u00fcr eine messbare Stelle.\",\"fehler_stille\":\"Die Datei enth\u00e4lt nur digitale Stille, es gibt also keinen Rauschteppich zu messen.\",\"fehler_keine_strecke\":\"Es fand sich keine Strecke von 0,4\u00a0s ohne digitale Stille.\",\"h_erklaerung\":\"Wie gemessen wird und was die Werte bedeuten\",\"erkl_teppich\":\"Die Datei wird in Fenster von 50\u00a0ms geteilt. Die leiseste Folge aus acht aufeinanderfolgenden Fenstern, 0,4\u00a0s, liefert den Rauschteppich als RMS in dBFS; Fenster aus exakten Nullen werden \u00fcbersprungen, weil digitale Stille kein Rauschen enth\u00e4lt.\",\"erkl_nf\":\"Der Regler nf von afftdn will den Pegel des Rauschens wissen, keine Vorliebe. In der Messung zum Artikel \u00fcber das Entrauschen lag die beste Einstellung \u00fcber sieben Rauschabst\u00e4nde 0,4 bis 1,6\u00a0dB am tats\u00e4chlichen Rauschteppich, w\u00e4hrend der Regler f\u00fcr die Rauschminderung \u00fcber seinen ganzen Bereich nur 1,13\u00a0dB \u00e4nderte. Der Befehl setzt deshalb nf und l\u00e4sst nr auf der Vorgabe.\",\"erkl_abstand\":\"Der Rauschabstand ist der RMS der ganzen Datei minus Rauschteppich. Der erwartbare Gewinn ist aus derselben Messung interpoliert: 0,15\u00a0dB bei 40\u00a0dB, 1,03\u00a0dB bei 30\u00a0dB, 2,87\u00a0dB bei 20\u00a0dB und 7,42\u00a0dB bei 6\u00a0dB. Er beschreibt das Testprogramm dieser Messung, nicht jede Aufnahme.\",\"erkl_art\":\"Ein Spektrum der leisen Stelle zeigt, ob das Rauschen Rauschen ist oder Brummen. afftdn wurde nur mit wei\u00dfem Rauschen gemessen; f\u00fcr Vinyl und Schellack hat es eigene Vorgaben, noise_type v und s.\",\"quellen_titel\":\"Quellen\",\"grenze\":\"Die leiseste Stelle muss reines Rauschen sein, damit der Wert stimmt; in einer Datei ohne Pause enth\u00e4lt sie noch Musik. Die Gewinnwerte stammen aus einem synthetischen Testprogramm mit wei\u00dfem Rauschen.\",\"lesen_h\":\"Artikel dazu\",\"lesen_1_vor\":\"Welcher Regler von afftdn wirkt und ab welchem Rauschabstand sich Entrauschen lohnt, misst der Artikel \u201e\",\"lesen_1_titel\":\"Entrauschen mit afftdn und anlmdn\",\"lesen_1_nach\":\"\u201c.\"};<\/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>Findet die leiseste Stelle einer Audiodatei und misst dort den Rauschteppich in dBFS, genau den Wert, den der Regler nf von afftdn in ffmpeg erwartet. Dazu Rauschabstand, was Entrauschen bei diesem Abstand in einer Messung brachte, ob Rauschen oder Brummen vorliegt, und ein fertiger ffmpeg-Befehl.<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":9283,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"template-tool-base.php","meta":{"footnotes":""},"tags":[92903],"class_list":["post-20207","page","type-page","status-publish","hentry","tag-music-production-de"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.1 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Rauschteppich-Messer: Rauschteppich in dBFS messen und die afftdn-Einstellung ablesen - 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\/de\/werkzeuge\/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=\"Rauschteppich-Messer: Rauschteppich in dBFS messen und die afftdn-Einstellung ablesen - Lukas Wojcik - Blog\" \/>\n<meta property=\"og:description\" content=\"Findet die leiseste Stelle einer Audiodatei und misst dort den Rauschteppich in dBFS, genau den Wert, den der Regler nf von afftdn in ffmpeg erwartet. Dazu Rauschabstand, was Entrauschen bei diesem Abstand in einer Messung brachte, ob Rauschen oder Brummen vorliegt, und ein fertiger ffmpeg-Befehl.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.lukaswojcik.com\/blog\/de\/werkzeuge\/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:41+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\\\/de\\\/werkzeuge\\\/noise-floor-meter-afftdn-setting\\\/\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/de\\\/werkzeuge\\\/noise-floor-meter-afftdn-setting\\\/\",\"name\":\"Rauschteppich-Messer: Rauschteppich in dBFS messen und die afftdn-Einstellung ablesen - Lukas Wojcik - Blog\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#website\"},\"datePublished\":\"2026-09-23T18:21:47+00:00\",\"dateModified\":\"2026-09-23T19:54:41+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/de\\\/werkzeuge\\\/noise-floor-meter-afftdn-setting\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/de\\\/werkzeuge\\\/noise-floor-meter-afftdn-setting\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/de\\\/werkzeuge\\\/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-2\\\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Rauschteppich-Messer: Rauschteppich in dBFS messen und die afftdn-Einstellung ablesen\"}]},{\"@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":"Rauschteppich-Messer: Rauschteppich in dBFS messen und die afftdn-Einstellung ablesen - 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\/de\/werkzeuge\/noise-floor-meter-afftdn-setting\/","og_locale":"en_US","og_type":"article","og_title":"Rauschteppich-Messer: Rauschteppich in dBFS messen und die afftdn-Einstellung ablesen - Lukas Wojcik - Blog","og_description":"Findet die leiseste Stelle einer Audiodatei und misst dort den Rauschteppich in dBFS, genau den Wert, den der Regler nf von afftdn in ffmpeg erwartet. Dazu Rauschabstand, was Entrauschen bei diesem Abstand in einer Messung brachte, ob Rauschen oder Brummen vorliegt, und ein fertiger ffmpeg-Befehl.","og_url":"https:\/\/www.lukaswojcik.com\/blog\/de\/werkzeuge\/noise-floor-meter-afftdn-setting\/","og_site_name":"Lukas Wojcik - Blog","article_modified_time":"2026-09-23T19:54:41+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\/de\/werkzeuge\/noise-floor-meter-afftdn-setting\/","url":"https:\/\/www.lukaswojcik.com\/blog\/de\/werkzeuge\/noise-floor-meter-afftdn-setting\/","name":"Rauschteppich-Messer: Rauschteppich in dBFS messen und die afftdn-Einstellung ablesen - Lukas Wojcik - Blog","isPartOf":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#website"},"datePublished":"2026-09-23T18:21:47+00:00","dateModified":"2026-09-23T19:54:41+00:00","breadcrumb":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/de\/werkzeuge\/noise-floor-meter-afftdn-setting\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.lukaswojcik.com\/blog\/de\/werkzeuge\/noise-floor-meter-afftdn-setting\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.lukaswojcik.com\/blog\/de\/werkzeuge\/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-2\/"},{"@type":"ListItem","position":3,"name":"Rauschteppich-Messer: Rauschteppich in dBFS messen und die afftdn-Einstellung ablesen"}]},{"@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\/20207","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=20207"}],"version-history":[{"count":4,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/pages\/20207\/revisions"}],"predecessor-version":[{"id":20299,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/pages\/20207\/revisions\/20299"}],"up":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/pages\/9283"}],"wp:attachment":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/media?parent=20207"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/tags?post=20207"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}