22.05kHz vs 44.1kHz - What's the Difference Between 'True Broadband' and Upsampling?
๐ Originally published (in Japanese) at forge.workstyle.tech.
When comparing outputs from voice conversion, have you ever wondered about this? "I'm exporting at 44.1kHz, but the sound still feels muffled." The export sampling rate is indeed 44.1kHz. It says so in the file properties. Yet, it lacks the "air" and clarity of CD quality.
The reason for this is that the sampling rate number and the actual frequency bandwidth contained in the audio are two different things. This article is a record of the definitive difference between "true wideband" and upsampling, which I verified when switching from a 22.05kHz model to a 44.1kHz F0-conditioned model in the "Voice Canva" app.
Premise: Sampling Rate Only Determines the "Ceiling"
First, let's cover the basics. According to the Nyquist-Shannon sampling theorem, the upper limit of the frequency that can be represented in audio with a sampling rate fs is fs / 2.
- 22.05kHz โ Limit: approx. 11kHz
- 44.1kHz โ Limit: approx. 22kHz
The crucial point here is that setting it to 44.1kHz means the audio can represent up to 22kHz; it does not mean the content is filled up to 22kHz. It determines the size of the container, but it doesn't automatically increase the contents.
Audio created at 22.05kHz simply has no components above 11kHz. Even if you resample (upsample) this to 44.1kHz, the empty high-frequency range remains empty. Even if you double the size of the container, what wasn't there cannot be created. This is the point that often defies intuition.
22.05kHz Models and 44.1kHz Models Are Different Entities
In the "Voice Canva" inference service, the model is switched via environment variables.
# Use the 44.1kHz F0-conditioned model (true wideband output). Default OFF (conventional 22.05kHz).
F0_COND = os.environ.get("VOICE_CANVA_F0", "0") == "1"
The startup script for 44k mode looks like this:
export VOICE_CANVA_F0="${VOICE_CANVA_F0:-1}" # Use 44k F0-conditioned model
export VOICE_CANVA_OUTPUT_SR="${VOICE_CANVA_OUTPUT_SR:-44100}" # Output also at 44.1kHz (no downsampling)
export VOICE_CANVA_AUTO_F0="${VOICE_CANVA_AUTO_F0:-1}" # Align carrier F0 to target pitch range
This is the decisive part. VOICE_CANVA_F0=1 is not simply a setting to "increase the output file rate." It replaces the generation model itself with a different model trained at 44.1kHz.
Internally, the 22k and 44k models use different checkpoints and vocoders. The 44k model utilizes a BigVGAN vocoder trained at a high sampling rate, meaning that during the stage where the mel-spectrogram is converted back into a waveform, the model can actually generate bandwidth above 11kHz.
In other words, instead of mechanically filling the empty high frequencies via resampling, it creates the content based on its learned knowledge. The sr (sampling rate) also switches to follow the model:
sr = mel_fn_args["sampling_rate"] # 44100 in f0 mode
The output rate is maintained at 44100 without downsampling. By maintaining a consistent path of "Generate at 44k โ Output at 44k," we ensure that the hard-won high frequencies aren't discarded midway.
Measurement: Is There Actually Energy in the High Frequencies?
To prove that the high-frequency content actually increased, we need numbers. I analyzed the spectrum of audio generated from the same input and measured the percentage of total energy occupying the bandwidth above 11kHz. The results were as follows:
- Output generated by 44.1kHz model: Approx. 7.4% of total energy was in the >11kHz band.
- 22.05kHz output upsampled to 44.1kHz: The >11kHz band was nearly zero.
Despite both being 44.1kHz files, the content is completely different. The upsampled version has a container that reaches 22kHz, but everything above 11kHz is empty. Meanwhile, the 44k model output has actual energy.
This 7.4% is the component that the ear perceives as the clarity of consonants, the "air" of a breath, and that general "CD quality" feel. While these numbers might seem obvious in hindsight, when comparing by ear, it's easy to conclude that "this one just sounds clearer." It was only by looking at the energy per band in the spectrum that I could objectively distinguish between "high frequencies being created" vs. "not being there."
Why Upsampling Doesn't Create High Frequencies
To explain the logic a bit further: upsampling is a process of interpolating between existing sample points. Whether using linear interpolation or higher-quality low-pass interpolation, what's happening is "connecting the existing waveform smoothly." It does not fabricate new frequency components (in fact, a proper resampler actively removes everything above the limit to prevent fake high frequencies from appearing as aliasing noise).
Therefore, "converting 22.05kHz audio to 44.1kHz" and "generating audio at 44.1kHz" result in fundamentally different content, even if the final "container" is the same. The former is interpolation; the latter is generation. Information like high-frequency detail can only be created by a model that "knows" what it should sound like.
Pitfalls and Lessons Learned
- Don't use the sampling rate number as proof of quality. "44.1kHz output" often becomes mere window dressing on a spec sheet; it doesn't guarantee the content is there. You can only claim it's "real" after measuring the energy per band.
- 44k models are heavy. The startup script explicitly mentions that "the model is large and generation is slow on CPU (GPU recommended)." Wideband isn't free; it's a trade-off for model size and inference cost. It's realistic to design a system that switches between 22k and 44k depending on the use case.
- Any downsampling in the pipeline ruins everything. Even if you generate at 44k, if you drop it to 22k at any later stage, the high frequencies vanish. It was critical to explicitly set
VOICE_CANVA_OUTPUT_SR=44100to ensure consistency from generation to output. - Question the root cause of "muffled" sound. When audio sounds muffled, boosting the high end with an EQ is only a temporary fix. You can't boost components that aren't there. The true solution was to switch to a model capable of generating high frequencies.
Summary
- Sampling rate only sets the upper limit of representable frequencies; it doesn't automatically fill the content.
- Upsampling 22.05kHz audio to 44.1kHz does not create high frequencies above 11kHz (it is interpolation, not generation).
VOICE_CANVA_F0=1is not just an output rate setting, but a switch to a separate model trained at 44.1kHz (including the BigVGAN vocoder).- Measurements showed that 44k model output has approx. 7.4% of total energy in the >11kHz band, while 22k upsampled output has nearly zero.
- Wideband comes at the cost of model size and inference overhead. The key is maintaining 44k consistency from generation to output without intermediate downsampling.
Comments
No comments yet. Start the discussion.