Форум программистов, компьютерный форум, киберфорум
Delphi: Графика, звук, видео
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.63/8: Рейтинг темы: голосов - 8, средняя оценка - 4.63
Unit_39
12 / 12 / 9
Регистрация: 16.05.2011
Сообщений: 109
1

Анализатор спектра тормозит

10.01.2013, 15:50. Просмотров 1571. Ответов 4
Метки нет (Все метки)

Привет! Собственно суть проблемы в названии темы.

Вот отрывки кода отвечающие за визуализацию. (код не мой)

Переменные
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
type
  FFTData = array[0..512] of Single;
  TPeaks = array[0..24] of Integer;      // макс. количество полос
 
var
  Buffer                          :TBitmap;
  FPeaks                          :TPeaks;
  FLimit                          :TPeaks;
  FData                           :FFTDATA;
  SpecHeight                      :integer = 0;
 
const
   BandCount = 25;
   ColWidth = 10;      // ширина полосы
В процедуре FormCreate
Delphi
1
2
3
4
5
      DoubleBuffered := true;
      Buffer := TBitmap.Create;
      Buffer.Width := Spectr.Width;
      Buffer.Height := Spectr.Height;
      SpecHeight := Buffer.Height - 2; // предел высоты
В событии OnPaint для PainBox`a
Delphi
1
2
3
4
5
procedure TMain_Window.SpectrPaint(Sender: TObject);
begin
    BitBlt(Spectr.Canvas.Handle, 0, 0, Buffer.Width, Buffer.Height,
            Buffer.Canvas.Handle, 0, 0, SRCCOPY);
end;
Сама процедура отрисовки
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
procedure SpectrumRender(X, Y: integer; PauseStop: boolean = false);
var
  i, YPos, e                :Integer;
  info_chan                 :BASS_CHANNELINFO;
  dy                        :integer;
begin
 
   PatBlt(Buffer.Canvas.Handle, 0, 0, Buffer.Width, Buffer.Height, WHITENESS);
 
   BASS_ChannelGetInfo(Stream, info_chan); // вытаскиваем информацию
 
  if PauseStop then // падение пик, если статус потока Пауза или Стоп
  begin
   for e := 0 to 512 do
    FData[e] := 0;
  end;
 
  for i := 0 to BandCount - 1 do
  begin
   // работаем с полученными данными
   YPos := Trunc(info_chan.freq / 512 * abs(fdata[i])); // как в TBassPlayer
 
   if YPos > SpecHeight then YPos := SpecHeight;
   if YPos >= FPeaks[i] then FPeaks[i] := YPos
    else FPeaks[i] := FPeaks[i] - 1; // если поставить 0, то пики не будут падать
 
   if YPos >= FLimit[i] then FLimit[i] := YPos - 1
    else FLimit[i] := FLimit[i] - 4; // скорость падения полосы
 
   if (Buffer.Height - FPeaks[i]) > Buffer.Height then FPeaks[i] := 0;
   if (Buffer.Height - FLimit[i]) > Buffer.Height then FLimit[i] := 0;
 
 
   for dy := 0 to Main_Window.Spectr.Height do
   begin
    if (dy mod ColWidth = 0) then
    begin
     // рисуем горизонтальные линии, чтобы получился эффект блоков
     Buffer.Canvas.Pen.Color := clWhite; // цвет равный
     Buffer.Canvas.MoveTo(0, dy);
     Buffer.Canvas.LineTo(Main_Window.Spectr.Width, dy);
 
 
     // рисуем полосы
     Buffer.Canvas.Pen.Color := clLtGray;
     Buffer.Canvas.Brush.Color := clLtGray;
     Buffer.Canvas.Rectangle(
       X + i * (ColWidth + 1), Y + Buffer.Height - FLimit[i],
       X + i * (ColWidth + 1) + ColWidth, Y + Buffer.Height);
 
 
     // рисуем обычные пики
     Buffer.Canvas.Pen.Color := clRed;
     Buffer.Canvas.MoveTo(X + i * (ColWidth + 1),  Y + Buffer.Height - FPeaks[i]);
     Buffer.Canvas.LineTo(X + i * (ColWidth + 1) + ColWidth, Y  + Buffer.Height - FPeaks[i]);
    end;
   end;
 
   Main_Window.Spectr.Invalidate; // обновляем картинку
  end;
 
end;
Таймер
Delphi
1
2
        BASS_ChannelGetData(Stream, @FData, BASS_DATA_FFT512);                       
        SpectrumRender(1, -1, BASS_ChannelIsActive(Stream) <> BASS_ACTIVE_PLAYING);
Кто чем сможет Любые мысли и догадки
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.01.2013, 15:50
Ответы с готовыми решениями:

Proteus. Анализатор спектра
Есть провод с сигналом, надо снять его спектр. Есть ли в протеусе спектрограф, и если да - как им...

10-ти полосный анализатор спектра
Доброго дня всем! Надумал я сделать анализатор спектра по материалам которые находятся тут...

"Нестандартный" анализатор спектра
В последнее время озадачился я изучением алгоритмов цифровой обработки сигналов. Добрался до...

GSP-7830 - анализатор спектра
Добрый день! Подскажите пожалуйста, где и кому продать GSP-7830 - анализатор спектра....

4
raxp
10202 / 6584 / 493
Регистрация: 28.12.2010
Сообщений: 21,166
Записей в блоге: 1
10.01.2013, 16:14 2
...куски не вашего кода не нужны, не видно полного проекта вашего, может чего намудрили. А вообще, пример визуализации спектра из пакета BASS с офсайта работает без тормозов.
0
Alex_pac
1297 / 703 / 107
Регистрация: 25.05.2011
Сообщений: 2,158
Записей в блоге: 51
10.01.2013, 19:45 3
http://jqbook.narod.ru/delphi/bass_vis.htm
0
Unit_39
12 / 12 / 9
Регистрация: 16.05.2011
Сообщений: 109
11.01.2013, 10:33  [ТС] 4
raxp, Вот проект.
0
Вложения
Тип файла: 7z Player.7z (796.6 Кб, 100 просмотров)
Unit_39
12 / 12 / 9
Регистрация: 16.05.2011
Сообщений: 109
12.01.2013, 13:21  [ТС] 5
Есть какие - нибудь мысли, догадки?
0
12.01.2013, 13:21
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.01.2013, 13:21

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Анализатор звукового спектра средствами Qt
Доброе время суток, хочу написать свою первую программу(GUI) выбор пал на Qt. Хочу попробовать...

Нужен анализатор спектра изображений
Есть ли какие-то готовые программы для анализа спектра изображений?

Анализатор спектра на 128 полос
Всем привет. Нужен анализатор спектра для &quot;украшения&quot; колонок. Под дисплей 64*128 Недавно...

сонограф (анализатор спектра) на stm
есть такая замечательная прога spectraplus, показывающая в реальном времени сонограмму звуков. если...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.