{"id":20206,"date":"2026-09-23T20:21:40","date_gmt":"2026-09-23T18:21:40","guid":{"rendered":"https:\/\/www.lukaswojcik.com\/blog\/toolbox\/noise-floor-meter-afftdn-setting\/"},"modified":"2026-09-23T21:54:36","modified_gmt":"2026-09-23T19:54:36","slug":"noise-floor-meter-afftdn-setting","status":"publish","type":"page","link":"https:\/\/www.lukaswojcik.com\/blog\/en\/toolbox\/noise-floor-meter-afftdn-setting\/","title":{"rendered":"Noise Floor Meter: measure the noise floor in dBFS and get the afftdn setting"},"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;\">Finds the quietest passage of an audio file, measures the noise floor there in dBFS and gives the matching noise floor setting for ffmpeg&#039;s afftdn denoiser, together with the noise level below the signal and what denoising can gain at that level. The file is read in the browser and not uploaded.<\/p>\n<div id=\"rt-zone\" class=\"rt-zone\">\n<p style=\"margin: 0 0 12px; color: var(--text-primary, #e8e8ee); font-weight: 700;\">Choose an audio file with a pause or a quiet passage<\/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;\">Select file<\/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 and AIFF are read sample by sample; FLAC, MP3, M4A, Ogg and Opus go through the browser&#039;s decoder.<\/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\">Command for 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\">Copy result<\/button><br \/>\n        <span id=\"rt-kopiert\" class=\"rt-klein\" style=\"margin-left: 10px;\"><\/span><\/p>\n<div class=\"rt-h\">Measured values<\/div>\n<div class=\"rt-tabelle\">\n<table class=\"rt-karten\">\n<thead>\n<tr>\n<th>Quantity<\/th>\n<th>Value<\/th>\n<th>Meaning<\/th>\n<\/tr>\n<\/thead>\n<tbody id=\"rt-details\"><\/tbody>\n<\/table><\/div>\n<\/p><\/div>\n<div class=\"rt-h\">How it is measured and what the values mean<\/div>\n<p class=\"rt-klein\" style=\"margin: 0 0 6px;\">The file is divided into windows of 50\u00a0ms. The quietest run of eight consecutive windows, 0.4\u00a0s, gives the noise floor as RMS in dBFS; windows of exact zeros are skipped because digital silence contains no noise.<\/p>\n<p class=\"rt-klein\" style=\"margin: 0 0 6px;\">The nf control of afftdn expects the level of the noise, not a preference. In the measurement for the article on denoising, the best setting landed within 0.4 to 1.6\u00a0dB of the real noise floor across seven noise levels, while the noise reduction control changed the result by only 1.13\u00a0dB over its whole range. The command therefore sets nf and leaves nr at its default.<\/p>\n<p class=\"rt-klein\" style=\"margin: 0 0 6px;\">The noise below the signal is the RMS of the whole file minus the noise floor. The expected gain is interpolated from the same measurement: 0.15\u00a0dB at 40\u00a0dB, 1.03\u00a0dB at 30\u00a0dB, 2.87\u00a0dB at 20\u00a0dB and 7.42\u00a0dB at 6\u00a0dB. It describes the test programme of that measurement, not every recording.<\/p>\n<p class=\"rt-klein\" style=\"margin: 0 0 6px;\">A spectrum of the quiet passage shows whether the noise is hiss or hum. afftdn was measured with white noise only; for vinyl and shellac it has presets of its own, noise_type v and s.<\/p>\n<p style=\"font-weight: 700; color: var(--text-primary, #e8e8ee); font-size: 0.95rem; margin: 24px 0 8px;\">Articles on this<\/p>\n<p class=\"rt-klein\" style=\"margin: 0 0 6px;\">Which control of afftdn matters and from which noise level denoising pays off is measured in the article \u201c<span class=\"lw-artikel-geplant\">Denoising With afftdn and anlmdn<\/span>\u201d.<\/p>\n<p class=\"rt-klein\" style=\"margin: 20px 0 0;\">Sources:<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;\">The quietest passage has to be pure noise for the value to be right; in a file without a pause it still contains music. The gain figures come from a synthetic test programme with white noise.<\/p>\n<\/div>\n<p><script>\n(function () {\n    'use strict';\n    const T = {\"dezimal\":\".\",\"einleitung\":\"Finds the quietest passage of an audio file, measures the noise floor there in dBFS and gives the matching noise floor setting for ffmpeg\\u0027s afftdn denoiser, together with the noise level below the signal and what denoising can gain at that level. The file is read in the browser and not uploaded.\",\"zone_titel\":\"Choose an audio file with a pause or a quiet passage\",\"knopf_datei\":\"Select file\",\"zone_hinweis\":\"WAV and AIFF are read sample by sample; FLAC, MP3, M4A, Ogg and Opus go through the browser\\u0027s decoder.\",\"status_lesen\":\"Reading the file \u2026\",\"status_dekodieren\":\"Decoding \u2026\",\"k_teppich\":\"Noise floor\",\"k_abstand\":\"Noise below the signal\",\"k_nf\":\"afftdn nf\",\"k_gewinn\":\"Best gain measured\",\"urteil_nicht\":\"Denoising hardly pays off\",\"urteil_wenig\":\"Denoising brings little\",\"urteil_lohnt\":\"Denoising pays off\",\"urteil_offen\":\"No steady noise found\",\"urteil_brumm\":\"Hum rather than noise\",\"urteil_text_brumm\":\"In the quietest passage a hum line at {hz} and its multiples carries most of the level. afftdn was measured with white noise only; the nf value below describes the whole level of the passage, hum included, and a notch or high-pass filter for the hum comes first.\",\"urteil_text_nicht\":\"The noise lies 40\u00a0dB or more below the signal. In the measurement behind this tool, the best of 23 settings improved the result by no more than {gewinn} at such a level, while afftdn intervenes in the treble.\",\"urteil_text_wenig\":\"Between 30 and 40\u00a0dB of noise below the signal, the best setting in the measurement gained about {gewinn}. Whether that is worth an intervention in the treble is a judgement for the ear.\",\"urteil_text_lohnt\":\"Less than 30\u00a0dB of noise below the signal: here the measurement found about {gewinn} of improvement with the best setting, and the setting matched the real noise floor.\",\"urteil_text_offen\":\"The quietest passage varies by 3\u00a0dB or more in level or consists largely of tonal lines, so music is still playing there. The value shown is an upper limit for the noise floor; a file with a real pause gives a reliable one.\",\"h_befehl\":\"Command for ffmpeg\",\"datei_ein\":\"input.wav\",\"datei_aus\":\"output.wav\",\"knopf_kopieren\":\"Copy result\",\"kopiert\":\"copied\",\"kopieren_fehler\":\"copying not possible\",\"h_details\":\"Measured values\",\"sp_groesse\":\"Quantity\",\"sp_wert\":\"Value\",\"sp_bedeutung\":\"Meaning\",\"d_format\":\"Format\",\"b_format\":\"WAV and AIFF are read unchanged; other formats come from the browser decoder at their own sample rate.\",\"d_kanaele\":\"Channels\",\"d_dauer\":\"Duration\",\"d_rms\":\"Level of the whole file\",\"b_rms\":\"RMS over all channels and the whole duration; the noise level below the signal is measured against it.\",\"d_strecke\":\"Quietest passage\",\"b_strecke\":\"The 0.4\u00a0s without digital silence with the lowest RMS; the noise floor is its level.\",\"d_spannweite\":\"Level range in the passage\",\"b_gleich\":\"Below 3\u00a0dB across eight 50\u00a0ms windows: steady noise.\",\"b_ungleich\":\"At least 3\u00a0dB across eight 50\u00a0ms windows: the level is not steady, so the passage probably still contains music.\",\"d_ton\":\"Tonal lines\",\"b_ton_gering\":\"Share of the energy in lines 10\u00a0dB above their surroundings, 100\u00a0Hz to 16\u00a0kHz. Low: noise.\",\"b_ton_hoch\":\"Share of the energy in lines 10\u00a0dB above their surroundings, 100\u00a0Hz to 16\u00a0kHz. From 40\u00a0%, notes are still sounding in the passage.\",\"d_stille\":\"Digital silence\",\"b_stille\":\"Stretches of exact zeros contain no noise and were skipped.\",\"d_hoch\":\"Energy above 2\u00a0kHz\",\"b_hoch\":\"Share of the noise energy in the passage above 2\u00a0kHz. White noise at 44.1\u00a0kHz puts about 90\u00a0% there; afftdn was measured with white noise.\",\"d_brumm\":\"Hum\",\"wert_kein\":\"none\",\"b_brumm_ja\":\"A line at this mains frequency or its multiples stands at least 15\u00a0dB above its surroundings. Hum is a line, not a floor; a notch or a high-pass filter meets it more precisely than a broadband denoiser.\",\"b_brumm_nein\":\"No line at 50 or 60\u00a0Hz or their multiples stands 15\u00a0dB above its surroundings.\",\"d_nf\":\"nf limited\",\"b_begrenzt\":\"afftdn accepts nf only between {min} and {max}; the value was set to the nearest limit.\",\"bericht_kopf\":\"Noise floor\",\"fehler_format\":\"This file is not one of the formats read here: WAV, AIFF, FLAC, MP3, M4A, Ogg or Opus.\",\"fehler_lesen\":\"The file could not be read or decoded.\",\"fehler_kurz\":\"The file is shorter than 0.4\u00a0s, too short for a passage to measure.\",\"fehler_stille\":\"The file contains only digital silence, so there is no noise floor to measure.\",\"fehler_keine_strecke\":\"No 0.4\u00a0s stretch without digital silence was found.\",\"h_erklaerung\":\"How it is measured and what the values mean\",\"erkl_teppich\":\"The file is divided into windows of 50\u00a0ms. The quietest run of eight consecutive windows, 0.4\u00a0s, gives the noise floor as RMS in dBFS; windows of exact zeros are skipped because digital silence contains no noise.\",\"erkl_nf\":\"The nf control of afftdn expects the level of the noise, not a preference. In the measurement for the article on denoising, the best setting landed within 0.4 to 1.6\u00a0dB of the real noise floor across seven noise levels, while the noise reduction control changed the result by only 1.13\u00a0dB over its whole range. The command therefore sets nf and leaves nr at its default.\",\"erkl_abstand\":\"The noise below the signal is the RMS of the whole file minus the noise floor. The expected gain is interpolated from the same measurement: 0.15\u00a0dB at 40\u00a0dB, 1.03\u00a0dB at 30\u00a0dB, 2.87\u00a0dB at 20\u00a0dB and 7.42\u00a0dB at 6\u00a0dB. It describes the test programme of that measurement, not every recording.\",\"erkl_art\":\"A spectrum of the quiet passage shows whether the noise is hiss or hum. afftdn was measured with white noise only; for vinyl and shellac it has presets of its own, noise_type v and s.\",\"quellen_titel\":\"Sources\",\"grenze\":\"The quietest passage has to be pure noise for the value to be right; in a file without a pause it still contains music. The gain figures come from a synthetic test programme with white noise.\",\"lesen_h\":\"Articles on this\",\"lesen_1_vor\":\"Which control of afftdn matters and from which noise level denoising pays off is measured in the article \u201c\",\"lesen_1_titel\":\"Denoising With afftdn and 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>Finds the quietest passage of an audio file and measures its noise floor in dBFS, the value the nf control of ffmpeg&#8217;s afftdn expects. Also shows the noise level below the signal, what denoising gained at that level in a measurement, whether the noise is hiss or hum, and a ready ffmpeg command.<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":38,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"template-tool-base.php","meta":{"footnotes":""},"tags":[92901],"class_list":["post-20206","page","type-page","status-publish","hentry","tag-music-production"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.1 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Noise Floor Meter: measure the noise floor in dBFS and get the afftdn setting - 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\/en\/toolbox\/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=\"Noise Floor Meter: measure the noise floor in dBFS and get the afftdn setting - Lukas Wojcik - Blog\" \/>\n<meta property=\"og:description\" content=\"Finds the quietest passage of an audio file and measures its noise floor in dBFS, the value the nf control of ffmpeg&#039;s afftdn expects. Also shows the noise level below the signal, what denoising gained at that level in a measurement, whether the noise is hiss or hum, and a ready ffmpeg command.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.lukaswojcik.com\/blog\/en\/toolbox\/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:36+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\\\/en\\\/toolbox\\\/noise-floor-meter-afftdn-setting\\\/\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/toolbox\\\/noise-floor-meter-afftdn-setting\\\/\",\"name\":\"Noise Floor Meter: measure the noise floor in dBFS and get the afftdn setting - Lukas Wojcik - Blog\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#website\"},\"datePublished\":\"2026-09-23T18:21:40+00:00\",\"dateModified\":\"2026-09-23T19:54:36+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/toolbox\\\/noise-floor-meter-afftdn-setting\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/toolbox\\\/noise-floor-meter-afftdn-setting\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/toolbox\\\/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\\\/en\\\/toolbox\\\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Noise Floor Meter: measure the noise floor in dBFS and get the afftdn setting\"}]},{\"@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":"Noise Floor Meter: measure the noise floor in dBFS and get the afftdn setting - 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\/en\/toolbox\/noise-floor-meter-afftdn-setting\/","og_locale":"en_US","og_type":"article","og_title":"Noise Floor Meter: measure the noise floor in dBFS and get the afftdn setting - Lukas Wojcik - Blog","og_description":"Finds the quietest passage of an audio file and measures its noise floor in dBFS, the value the nf control of ffmpeg's afftdn expects. Also shows the noise level below the signal, what denoising gained at that level in a measurement, whether the noise is hiss or hum, and a ready ffmpeg command.","og_url":"https:\/\/www.lukaswojcik.com\/blog\/en\/toolbox\/noise-floor-meter-afftdn-setting\/","og_site_name":"Lukas Wojcik - Blog","article_modified_time":"2026-09-23T19:54:36+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\/en\/toolbox\/noise-floor-meter-afftdn-setting\/","url":"https:\/\/www.lukaswojcik.com\/blog\/en\/toolbox\/noise-floor-meter-afftdn-setting\/","name":"Noise Floor Meter: measure the noise floor in dBFS and get the afftdn setting - Lukas Wojcik - Blog","isPartOf":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#website"},"datePublished":"2026-09-23T18:21:40+00:00","dateModified":"2026-09-23T19:54:36+00:00","breadcrumb":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/toolbox\/noise-floor-meter-afftdn-setting\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.lukaswojcik.com\/blog\/en\/toolbox\/noise-floor-meter-afftdn-setting\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/toolbox\/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\/en\/toolbox\/"},{"@type":"ListItem","position":3,"name":"Noise Floor Meter: measure the noise floor in dBFS and get the afftdn setting"}]},{"@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\/20206","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=20206"}],"version-history":[{"count":4,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/pages\/20206\/revisions"}],"predecessor-version":[{"id":20298,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/pages\/20206\/revisions\/20298"}],"up":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/pages\/38"}],"wp:attachment":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/media?parent=20206"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/tags?post=20206"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}