Войти
ПрограммированиеФорум2D графика и изометрия

Вывести большой Bitmap в окно с помощью openGL (7 стр)

Страницы: 1 2 3 4 5 6 7
#90
14:32, 8 дек. 2016

Abraziv
> Что значит должна была появиться после
После прочтения поста #49, должна была появиться мысль, что если с выводом текстуры все нормально, до дело в данных в ней. Т.е. не в визуализации а в генерации. Не?


#91
14:36, 8 дек. 2016

Не должна была, т.к. я не был уверен что перевожу спектральные отчёты в RGB правильно.

#92
14:45, 8 дек. 2016

Вообще всем спасибо за помощь, видно что все большие профессионалы, это я дерево с желудями.

#93
13:06, 12 дек. 2016

В общем меня заинтересовала тема, решил демку накидать.
FFT взял отсюда https://ru.wikibooks.org/wiki/Реализации_алгоритмов/Быстрое_преоб… зование_Фурье

  void CreateSpectrogram(Image& _img, const Color* _palette, uint _paletteSize, bool _linearFilter, WindowFunc _windowFunc)
  {
    const uint _targetWidth = 2048;
    const uint _targetHeight = 2048;

    const float _pixelsPerSecond = _targetWidth / (frames / (float)samplerate); // target width / audio length
    const uint _frameSize = 2048; // FirstPow2(_targetHeight * 2); // fft window size
    
    /*float _overlap = .5f;
    uint _step = (uint)_frameSize * _overlap;
    const uint _targetWidth = frames / _step; */

    uint _step = (uint)(samplerate / _pixelsPerSecond);
    uint _width = _targetWidth; // (frames - _frameSize) / _step;
    uint _height = _targetHeight;

    LOG("Create spectorgram");
    LOG("FFT size: %d samples", _frameSize);
    LOG("Step: %d samples", _step);
    LOG("Pixels per second: %.2f", _pixelsPerSecond);
    LOG("Width: %d pixels", _width);
    LOG("Height: %d pixels", _height);
    
    float* _frame = new float[_frameSize];
    float* _real = new float[_frameSize];
    float* _imag = new float[_frameSize];

    _img.Alloc(_width, _height);

    float _invHeight = 1.f / _height;
    uint _frameHalfSize = _frameSize / 2;
    float _invFrameSize = 1.f / _frameSize;

    for (uint x = 0; x < _width; ++x)
    {
      // Чтение данных
      {
        uint _csize = _frameSize;
        uint _offset = x * _step;
        if (_offset + _frameSize >= frames)
          _csize = frames - _offset;

        const float* _src = data + _offset * channels;
        for (uint i = 0; i < _csize; ++i)
          _real[i] = _src[i * channels];

        memset(_real + _csize, 0, (_frameSize - _csize) * sizeof(_real[0])); // Дополнение нулями для соответствия размеру
      }

      // Выполнение оконной функции
      if (_windowFunc)
        _windowFunc(_real, _frameSize);

      // Преобразование в спектр
#if 1
      FFTAnalysis(_real, _frame, _frameSize, _frameSize);
#else
      memset(_imag, 0, _frameSize * sizeof(_imag[0])); // Обнуление мнимой части. Специфика функции.
      FFT(_real, _imag, _frameSize, (int)log2(_frameSize), FT_DIRECT);
      for (uint y = 0; y < _frameHalfSize; ++y)
        _frame[y] = 2 * sqrt(_real[y] * _real[y] + _imag[y] * _imag[y]) * _invFrameSize;
#endif
      // Немного уменьшить яркость
      for (uint y = 0; y < _frameHalfSize; ++y)
        _frame[y] *= 0.02f;

      // Конвертация в децибелы и нормализация
      float _max = 0;
      for (uint y = 0; y < _frameHalfSize; ++y)
      {
        _frame[y] = 10 * log10(_frame[y] + 1e-6f) / -60.f;
      }

      // Запись в изображение
      for (uint y = 0; y < _height; ++y)
      {
        float _val = Sample(y * _invHeight, _frame, _frameHalfSize, true); // 
        _img(x, y) = Sample(1 - _val, _palette, _paletteSize, _linearFilter); // 
      }
    }

    delete[] _frame;
    delete[] _real;
    delete[] _imag;
  }

В сравнении с FL Studio 12
Изображение

В сравнении с Audacity
Изображение

В цвете, окно 2048, Gaussian25
Изображение

Страницы: 1 2 3 4 5 6 7
ПрограммированиеФорум2D графика и изометрия

Тема в архиве.