blob: 39a3a94e767aafb274e24a2466b2fe075254cab3 [file] [log] [blame]
// Copyright 2018 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
#ifndef SRC_MEDIA_AUDIO_AUDIO_CORE_MIXER_TEST_FREQUENCY_SET_H_
#define SRC_MEDIA_AUDIO_AUDIO_CORE_MIXER_TEST_FREQUENCY_SET_H_
#include <zircon/types.h>
#include <array>
#include <fbl/algorithm.h>
namespace media::audio::test {
//
// In performing all of our audio analysis tests with a specific buffer length, we can choose input
// sinusoids with frequencies that perfectly fit within those buffers, eliminating the need for FFT
// windowing. Our measurement frequencies have been specifically chosen as approximations of the
// standard "3 freqs per octave" representative set, assuming a 65536/48000 ratio between buffer
// size and eventual sample rate.
//
// Working in concert with GenerateCosine, these summary frequencies (currently 40 Hz, 1 kHz and 12
// kHz) are "phase-locked" to the size of the buffer used in our frequency-based testing, in that
// the actual frequency is calculated so that there is an exact integral number of complete
// sinusoidal periods within the source data buffer. This eliminates the need for us to performing
// windowing or other data conditioning before performing frequency analysis, although it does make
// the actual values sent to GenerateCosine slightly different than the actual frequency.
// Furthermore, we adjust these values slightly so that their periods are not closely related
// geometrically to the sample rate -- we do this so that sampling of a given sinusoid will be more
// statistically spread across the entire waveform, rather than this happening at just a few spots
// (for example, using approximately 11997.8 Hz instead of 12000 Hz).
//
// For now we assume an eventual 48 kHz output sample rate, so (along with our source buffer of size
// 65536) this translation ratio is 65536/48000. In other words, the 'freq' value that we should
// send to GenerateCosine in order to simulate a 1 kHz sinusoid would be 1363.
//
static constexpr uint32_t kFreqTestBufSize = 65536;
//
// To better model how our resamplers are used by the rest of the system, when testing our
// resamplers, we use multiple smaller jobs rather than mixing the entire 64k samples at one go.
// Breaking our 64k buffer into 256 subjobs will emulate ~5.33ms buffers (64k/256 = 256 samples @
// 48kHz); breaking it into 128 (512-sample packets) will model client submissions of ~10.67ms, etc.
//
// In our audio fidelity tests (noise floor, frequency response, SINAD, dynamic range, out-of-band
// rejection, plus others in the future), we compare current measurements to previous results. For
// any set of inputs, our results are always exactly the same -- but we should note that (as
// currently implemented), configuration changes (such as adjustments to the below const) affect
// frequency response and SINAD results in ways that differ by frequency. Doubling the resampling
// packet size, as an example, may improve frequency response at 25 Hz but degrade it at 10 kHz.
// With this in mind, the values we have saved as thresholds represent the worst-case results across
// kResamplerTestNumPackets values of
// [1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768].
static constexpr uint32_t kResamplerTestNumPackets = 256;
class FrequencySet {
public:
static bool UseFullFrequencySet;
// The full-spectrum audio tests use a broad set of standard frequencies.
static constexpr uint32_t kNumReferenceFreqs = 48;
// A subset of these frequencies are within the guaranteed in-band range, wrt output frequency.
// In other words, [39] translates into 24kHz, and these tests assume a 48kHz output frequency.
static constexpr uint32_t kNumInBandReferenceFreqs = 40;
// Each val represents a standard frequency within the broad set.
static const std::array<uint32_t, kNumReferenceFreqs> kReferenceFreqs;
// Because of translation between power-of-two-sized buffers and sample rate,
// values in kReferenceFreqs translate into the following actual frequencies:
static const std::array<uint32_t, kNumReferenceFreqs> kRefFreqsTranslated;
// Certain tests (such as noise floor and sinad) are evaluated with a
// sinusoidal input at a single reference frequency (usually close to 1 kHz).
static constexpr uint32_t kRefFreqIdx = 20; // [20] is 1kHz reference tone.
static const uint32_t kReferenceFreq;
// Summary audio tests use a small frequency set taken from the full list.
static constexpr uint32_t kNumSummaryIdxs = 3;
// Each val is a kReferenceFreqs index, pointing to a summary freq.
static const std::array<uint32_t, kNumSummaryIdxs> kSummaryIdxs;
// class is static only - prevent attempts to instantiate it
FrequencySet() = delete;
};
} // namespace media::audio::test
#endif // SRC_MEDIA_AUDIO_AUDIO_CORE_MIXER_TEST_FREQUENCY_SET_H_