> For the complete documentation index, see [llms.txt](https://docs.ndi.video/all/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.ndi.video/all/getting-started/white-paper/ndi-audio-levels.md).

# NDI Audio Levels

Making Sense of NDI and Professional Audio Levels

## Introduction

Given the historical specification of NDI floating-point audio levels in terms of dBu (an analog, voltage-based measurement having no direct connection to either integer or floating-point digital values) there has been significant confusion related to proper NDI audio levels. This document aims to explain the original NDI audio level specification, why it does not make sense in a multi-format world, and what to do instead.

## What is a dB?

A dB or decibel is a logarithmic unit used to measure sound intensity or magnitude. The decibel represents a ratio between two values and is therefore unitless. The decibel values most typically used in professional audio production are root-power quantities (amplitude or voltage) calculated using the following formula:

$$dB = 20 \* log\_{10} ( \frac{F}{F\_0} )$$

Where $$F$$ and $$F\_0$$ are the two values being compared. Typically, $$F$$ is the value being measured and $$F\_0$$ represents the 0.0 dB reference level.

### Reference Level

As the decibel is a unitless measure, the ratio scale needs to be anchored or indexed to a specific level, referred to here as the reference level. This specified level represents 0.0 dB.

### Program Reference Level

In addition to the 0.0 dB anchor of the reference level, audio workflows also have a separate program reference level, sometimes referred to as alignment level. This level is the signal amplitude that represents the “typical” signal level when mixing, which would normally equal 0.0 dBVU on an audio mixing console. In other words, the standard signal level which all inputs are aligned to for mixing.

The program reference level is sometimes defined by standards (eg: the SMPTE program reference level for integer audio samples is -20.0 dBFS) but is really workflow specific. Different audio productions use various program reference levels based on the specific task and required results. For example, mixing workflows typically operate with more headroom than would be needed or desired for something like generating a CD master where given the 16-bit output format and 96 dB dynamic range, the headroom from the mix output is typically reduced in order to improve the noise floor. The program reference level is also sometimes intentionally modified to affect perceived loudness, see for example: [Loudness War](https://en.wikipedia.org/wiki/Loudness_war)

## Standard Reference Levels & Program Reference Levels

A variety of decibel-based units of measurement are used in audio production. Several common units and their relationship with each other and NDI are listed here.

### dBu

Voltage relative to the RMS voltage that would dissipate 0dBm (1 mW) in a 600 ohm load:

$$0.0 dBu = \sqrt{0.6}V\_{RMS} \approx 0.7746V\_{RMS}$$

Program reference level: +4.0 dBu (SMPTE per RP-155)

Program reference level: 0.0 dBu (EBU)

Commonly used to specify professional audio levels on XLR audio connections.

### dBV

Voltage relative to 1.0 volt RMS:

$$0.0 dBV = 1.000V\_{RMS}$$

Program reference level: -10.0 dBV (Consumer line level)

Commonly used to specify consumer audio levels on RCA audio connections.

### dBFS

A unit of measurement for amplitude levels in digital systems which have a defined maximum peak level. Used in digital audio production where PCM audio values are represented by fixed length integer values, typically 16, 24, or 32 bits in length.

#### Full-Scale

A full-scale sine wave has positive peaks with a value of 7FFFFF (hex) and negative peaks with a value of 800000 (hex) in a 24-bit digital audio system. For other bit depths, refer to the appropriate standard.

Reference level (24-bit): 0x800000-0x7FFFFF

#### SMPTE Levels

Program reference level is -20dB (1/10 of Reference Level) per SMPTE RP-155:2014

Program Reference Level (24-bit): 0xF33333-0x0CCCCD

#### EBU Levels

Program reference level is 1/8 of reference level (approximately -18.0618dB) per EBU R68-2000

Program Reference Level (24-bit): 0xF00000-0x0FFFFF

### dB<sub>NDI</sub>

A sensible modern definition of NDI audio levels.

Reference Level: Normalized sine wave with peaks of -1.0 to +1.0

Program reference level: 0.0 dB<sub>NDI</sub>

### dB<sub>NDI</sub> (Legacy)

The historical definition of NDI audio levels and a source of significant confusion.

Reference Level: Normalized sine wave with peaks of -1.0 to +1.0 = +4.0 dBu

Program reference level: Undefined

## Legacy NDI Audio Levels

Since at least 4.x, NDI has defined audio levels such that a normalized floating-point sine wave is equal to +4.0 dBu. In a SMPTE workflow this means that an NDI program reference level signal is equal to a normalized -1.0 to +1.0 floating-point sine wave, -20 dBFS digital signal, and +4.0 dBu analog signal.

Problems arise, however, when trying to interface with non-SMPTE audio workflows. EBU program reference levels differ from SMPTE by -4.0 dBu and approximately +2.0 dBFS. If the NDI program reference level is really +4.0 dBu, conversion between NDI audio levels and EBU (or any non-SMPTE) based audio levels becomes very confusing. For instance, an EBU analog audio signal "properly" converted to NDI would have a program reference level of -4.0 dB<sub>NDI</sub> while a similarly converted SMPTE audio signal would have a program reference level of 0.0 dB<sub>NDI</sub>, making it impossible to properly mix NDI signals without knowing the signal's origin.

In addition, specifying a floating-point audio reference level using dBu does not really make sense. NDI floating-point audio values are at least two steps removed from the analog voltage reference used by dBu, and one step removed from the fixed-point values used by dBFS. A more sensible solution is to define NDI floating-point audio levels in terms of the audio signal itself.

Essentially, the original specification for NDI audio levels that a normalized sine wave is equal to +4.0 dBu was a United States and SMPTE-centric attempt to specify NDI audio levels in terms of program reference level. No effort was made to allow for alternate audio level workflows, and software and products sold by NewTek (and later by Vizrt) made no distinction between SMPTE, EBU, or other audio level standards.

## Modern NDI Audio Levels

To address the legacy NDI issues above, the reference to +4.0 dBu is removed from the definition of NDI audio levels and a normalized -1.0 to +1.0 sine wave is specified as both the reference level and the program reference level for NDI audio (see dB<sub>NDI</sub>, above). This allows proper mixing NDI audio sources regardless of origin or destination and makes conversion to and from NDI floating-point audio straightforward.

Rather than confusing and unspecified conversions based on analog voltage levels, converting to and from NDI audio levels becomes a straight-forward conversion between clearly defined program reference levels. Whether SMPTE, EBU, or other reference levels are used in a workflow, the conversions to and from NDI can be clearly defined by simply matching the desired program reference level to NDI's normalized sine wave.

## Other Floating-Point Standards

There are other audio level standards for floating-point audio. One common standard used by ffmpeg and Premiere is to equate a normalized floating-point sine wave with what ffmpeg refers to as "full volume level" or what would be 0 dBFS if using integers:

Reference Level: Normalized sine wave with peaks of -1.0 to +1.0

Program reference level: Varies, typically -20 dBFS (SMPTE) or -18 dBFS (EBU)

This format is referred to as `Audio_float_dBFS_ref` in the conversions below.

## Conversions

With NDI audio levels defined by program reference level, conversion to other formats becomes more straight-forward. Refer to the following examples for several common conversions needed between fixed point and NDI floating-point audio levels.

### SMPTE

```c
// SMPTE program reference level = 1/10 full-scale
NDI_Float = ((float) Audio_16_bit) / 0x0CCD;
NDI_Float = ((float) Audio_24_bit) / 0x0CCCCD;
NDI_Float = ((float) Audio_32_bit) / 0x0CCCCCCD;
NDI_Float = Audio_float_dBFS_ref * 10.0;

Audio_16_bit = (int) (NDI_Float * 0x0CCD);
Audio_24_bit = (int) (NDI_Float * 0x0CCCCD);
Audio_32_bit = (int) (NDI_Float * 0x0CCCCCCD);
Audio_float_dBFS_ref = NDI_Float / 10.0;
```

### EBU

```c
// EBU program reference level = 1/8 full-scale
NDI_Float = ((float) Audio_16_bit) / 0x0FFF;
NDI_Float = ((float) Audio_24_bit) / 0x0FFFFF;
NDI_Float = ((float) Audio_32_bit) / 0x0FFFFFFF;
NDI_Float = Audio_float_dBFS_ref * 8.0;

Audio_16_bit = (int) (NDI_Float * 0x0FFF);
Audio_24_bit = (int) (NDI_Float * 0x0FFFFF);
Audio_32_bit = (int) (NDI_Float * 0x0FFFFFFF);
Audio_float_dBFS_ref = NDI_Float / 8.0;
```

## Real-World Complications

Given the confusing original specification for NDI floating-point audio levels (particularly for non-SMPTE workflows) and the existence of popular floating-point formats with different reference level specifications there are many existing workflows where audio levels are not handled as specified here.

This creates situations where there may not always be a single correct method to properly align audio levels. In such situations, for maximum flexibility and consistency of user experience, it is recommended that the user is provided with a means to adjust the gain or pad setting used for that conversion. If possible, the user would be presented with the choices below. The discrete options are expected to cover most of the common cases, and a custom option for anything else.

### NDI Audio Conversion Gain Options

* 20 dB or 10x gain/pad: Local program reference level is SMPTE (Default)
* 18 dB or 8x gain/pad: Local program reference level is EBU
* 0 dB or 0x gain/pad: No change to audio levels, matching incorrect behavior in some applications which directly passed audio data between NDI and ffmpeg or Premiere without properly adjusting for program reference level
* Custom : User can adjust for anything not covered by the above options

Otherwise, when details about the NDI audio reference level and/or the local program reference level are unknown, it is recommended that the SMPTE formulas above are used for any needed conversions. This most closely matches the historical handling of audio levels in NDI applications.


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://docs.ndi.video/all/getting-started/white-paper/ndi-audio-levels.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
