Я написал функцию для выполнения БПФ на массиве из 1024 выборок.Я пытаюсь использовать выходные данные этой функции для построения спектрограммы.
График имеет очень противоречивый ввод, проводя большую часть своего времени в 0, и когда он показывает что-то, похоже, очень мало связан с музыкойсовсем.Я включил два скриншота для демонстрации.
Я включил пару скриншотов и код, используемый для выполнения БПФ.У кого-нибудь есть идеи, почему получаемый результат такой плохой?
Кроме того, я заметил, что нижний предел спектрограммы "пиковый", так как в нем нравится много прыгать.
Странный вывод:
Нет вывода (происходит от 1/2 до 2/3 всех нарисованных кадров):
Код:
// Get the samples
AudioSampleType *samples = [_songModel nextSamplesWithLength: _fftN];
if (samples == nil)
return nil;
// Convert AudioSampleTypes (SInt16s) into floats between -1.0 and 1.0
// (required by the DSP library).
for (int i = 0; i < _fftN; i++)
_inputReal[i] = (samples[i] + 0.5) / 32767.5;
// Window the input
vDSP_vmul(_inputReal, 1, _hanningWindow, 1, _windowedReal, 1, _fftN);
// Convert our real input into even-odd form
vDSP_ctoz((COMPLEX *)_windowedReal, 2, &_fourierOutput, 1, _fftHalfN);
// Perform the fast fourier transform
vDSP_fft_zrip(_fftSetup, &_fourierOutput, 1, _fftLog2n, FFT_FORWARD);
// Calculate magnitudes (will output to the real part of the COMPLEX_SPLIT)
vDSP_zvmags(&_fourierOutput, 1, _fourierOutput.realp, 1, _fftHalfN);
// Build and return the input and output of the analysis
return [[FrequencyData alloc] initWithSignal:_inputReal
signalLength:_fftN
frequencyMagnitudes:_fourierOutput.realp
magnitudeLength:_fftHalfN];
Редактировать
Код настройки:
_fftN = 1 << _fftLog2n;
_fftHalfN = _fftN / 2;
_stride = 1;
_fourierOutput.realp = (float *) malloc(_fftHalfN * sizeof(float));
_fourierOutput.imagp = (float *) malloc(_fftHalfN * sizeof(float));
_hanningWindow = (float *) malloc(_fftN * sizeof(float));
vDSP_hann_window(_hanningWindow, _fftN, 0);
_inputReal = (float *) malloc(_fftN * sizeof(float));
_windowedReal = (float *) malloc(_fftN * sizeof(float));
_fftSetup = vDSP_create_fftsetup(_fftLog2n, FFT_RADIX2);