Jumpy / некорректно выглядящий спектрограф на iOS5 - PullRequest
1 голос
/ 08 марта 2012

Я написал функцию для выполнения БПФ на массиве из 1024 выборок.Я пытаюсь использовать выходные данные этой функции для построения спектрограммы.

График имеет очень противоречивый ввод, проводя большую часть своего времени в 0, и когда он показывает что-то, похоже, очень мало связан с музыкойсовсем.Я включил два скриншота для демонстрации.

Я включил пару скриншотов и код, используемый для выполнения БПФ.У кого-нибудь есть идеи, почему получаемый результат такой плохой?

Кроме того, я заметил, что нижний предел спектрограммы "пиковый", так как в нем нравится много прыгать.

Странный вывод:

Sometimes some output is, but the magnitudes don't look right

Нет вывода (происходит от 1/2 до 2/3 всех нарисованных кадров):

For maybe 1/2 to 2/3rds of the time, no output is shown

Код:

// 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);

1 Ответ

0 голосов
/ 08 марта 2012

Результаты без вывода, вероятно, связаны с ошибкой где-то еще в вашем коде (возможно, при чтении песни или написании кода).

«Странный вывод» может быть правильным результатом БПФ для записанной музыки, поскольку полный спектр аудиосигналов интересных музыкальных инструментов и голосов может сильно отличаться от только нотных нот.

...