Android SuperPowered SDK 音频 - 频域示例 - memset 频率操作
Android SuperPowered SDK Audio - Frequency Domain example - memset frequency manipulation
我正在尝试了解 Superpowered SDK,但对 Android 和 C++ 以及音频信号都是新手。我有来自这里的频域示例:
https://github.com/superpoweredSDK/Low-Latency-Android-Audio-iOS-Audio-Engine/tree/master/Examples_Android/FrequencyDomain
运行 在我的 Nexus 5X 上。在 FrequencyDomain.cpp 文件中:
static SuperpoweredFrequencyDomain *frequencyDomain;
static float *magnitudeLeft, *magnitudeRight, *phaseLeft, *phaseRight, *fifoOutput, *inputBufferFloat;
static int fifoOutputFirstSample, fifoOutputLastSample, stepSize, fifoCapacity;
#define FFT_LOG_SIZE 11 // 2^11 = 2048
static bool audioProcessing(void * __unused clientdata, short int *audioInputOutput, int numberOfSamples, int __unused samplerate) {
SuperpoweredShortIntToFloat(audioInputOutput, inputBufferFloat, (unsigned int)numberOfSamples); // Converting the 16-bit integer samples to 32-bit floating point.
frequencyDomain->addInput(inputBufferFloat, numberOfSamples); // Input goes to the frequency domain.
// In the frequency domain we are working with 1024 magnitudes and phases for every channel (left, right), if the fft size is 2048.
while (frequencyDomain->timeDomainToFrequencyDomain(magnitudeLeft, magnitudeRight, phaseLeft, phaseRight)) {
// You can work with frequency domain data from this point.
// This is just a quick example: we remove the magnitude of the first 20 bins, meaning total bass cut between 0-430 Hz.
memset(magnitudeLeft, 0, 80);
memset(magnitudeRight, 0, 80);
我从这里了解到前 20 个 bin 是 0-430 Hz:
How do I obtain the frequencies of each value in an FFT?
但我不明白 memset 中 80 的值...是 4*20,它是一个 float * 20 bins 的 4 个字节吗? magnitudeLeft 是否保存所有频率的数据?然后我将如何删除,例如,从中间或从最后最高的 10 个频率箱?谢谢!
magnitudeLeft和magnitudeRight中的每个值都是一个浮点数,32位,4字节。
memset 接受一个字节数参数,所以 20 bins * 4 bytes = 80 bytes。
memset 以这种方式清除前 20 个 bin。
magnitudeLeft 和 magnitudeRight 都表示具有 1024 个浮点数的完整频率范围。它们的大小始终是 FFT 大小除以二,因此示例中为 2048 / 2。
从中间和顶部移除看起来像:
memset(&magnitudeLeft[index_of_first_bin_to_remove], 0, number_of_bins * sizeof(float));
注意第一个参数没有和sizeof(float)相乘,因为编译器知道magnitudeLeft是float,所以会自动输入正确的地址。
我正在尝试了解 Superpowered SDK,但对 Android 和 C++ 以及音频信号都是新手。我有来自这里的频域示例: https://github.com/superpoweredSDK/Low-Latency-Android-Audio-iOS-Audio-Engine/tree/master/Examples_Android/FrequencyDomain
运行 在我的 Nexus 5X 上。在 FrequencyDomain.cpp 文件中:
static SuperpoweredFrequencyDomain *frequencyDomain;
static float *magnitudeLeft, *magnitudeRight, *phaseLeft, *phaseRight, *fifoOutput, *inputBufferFloat;
static int fifoOutputFirstSample, fifoOutputLastSample, stepSize, fifoCapacity;
#define FFT_LOG_SIZE 11 // 2^11 = 2048
static bool audioProcessing(void * __unused clientdata, short int *audioInputOutput, int numberOfSamples, int __unused samplerate) {
SuperpoweredShortIntToFloat(audioInputOutput, inputBufferFloat, (unsigned int)numberOfSamples); // Converting the 16-bit integer samples to 32-bit floating point.
frequencyDomain->addInput(inputBufferFloat, numberOfSamples); // Input goes to the frequency domain.
// In the frequency domain we are working with 1024 magnitudes and phases for every channel (left, right), if the fft size is 2048.
while (frequencyDomain->timeDomainToFrequencyDomain(magnitudeLeft, magnitudeRight, phaseLeft, phaseRight)) {
// You can work with frequency domain data from this point.
// This is just a quick example: we remove the magnitude of the first 20 bins, meaning total bass cut between 0-430 Hz.
memset(magnitudeLeft, 0, 80);
memset(magnitudeRight, 0, 80);
我从这里了解到前 20 个 bin 是 0-430 Hz: How do I obtain the frequencies of each value in an FFT?
但我不明白 memset 中 80 的值...是 4*20,它是一个 float * 20 bins 的 4 个字节吗? magnitudeLeft 是否保存所有频率的数据?然后我将如何删除,例如,从中间或从最后最高的 10 个频率箱?谢谢!
magnitudeLeft和magnitudeRight中的每个值都是一个浮点数,32位,4字节。
memset 接受一个字节数参数,所以 20 bins * 4 bytes = 80 bytes。 memset 以这种方式清除前 20 个 bin。
magnitudeLeft 和 magnitudeRight 都表示具有 1024 个浮点数的完整频率范围。它们的大小始终是 FFT 大小除以二,因此示例中为 2048 / 2。
从中间和顶部移除看起来像:
memset(&magnitudeLeft[index_of_first_bin_to_remove], 0, number_of_bins * sizeof(float));
注意第一个参数没有和sizeof(float)相乘,因为编译器知道magnitudeLeft是float,所以会自动输入正确的地址。