Я пытаюсь понять 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 бинов отсюда 0-430 Гц:
Как получить частоты каждого значения в БПФ?
но я не понимаю значение 80 в memset … 4 * 20, это 4 байта для float * 20 бинов? Имеет ли magnitudeLeft данные для всех частот? Как бы я тогда убрал, например, 10 бинов частот из середины или самый высокий из конца? Спасибо!
Каждое значение в magnitudeLeft и magnitudeRight представляет собой число с плавающей запятой, которое составляет 32 бита и 4 байта.
memset принимает параметр количества байтов, поэтому 20 бинов * 4 байта = 80 байт.
memset очищает первые 20 корзин таким образом.
И magnitudeLeft, и magnitudeRight представляют полный частотный диапазон с 1024 числами с плавающей запятой. Их размер всегда равен размеру FFT, деленному на два, поэтому в примере 2048/2.
Удаление из середины и сверху выглядит примерно так:
MemSet (&magnitudeLeft [index_of_first_bin_to_remove], 0, number_of_bins * sizeof (float));
Обратите внимание, что первый параметр не умножается на sizeof (float), потому что компилятор знает, что magnitudeLeft является float, поэтому он автоматически введет правильный адрес.
Других решений пока нет …