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

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

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

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

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

Переменные
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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.01.2013, 15:50
Ответы с готовыми решениями:

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

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

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

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

4
10231 / 6609 / 498
Регистрация: 28.12.2010
Сообщений: 21,156
Записей в блоге: 1
10.01.2013, 16:14 2
...куски не вашего кода не нужны, не видно полного проекта вашего, может чего намудрили. А вообще, пример визуализации спектра из пакета BASS с офсайта работает без тормозов.
0
1302 / 708 / 107
Регистрация: 25.05.2011
Сообщений: 2,158
Записей в блоге: 51
10.01.2013, 19:45 3
http://jqbook.narod.ru/delphi/bass_vis.htm
0
12 / 12 / 9
Регистрация: 16.05.2011
Сообщений: 109
11.01.2013, 10:33  [ТС] 4
raxp, Вот проект.
Вложения
Тип файла: 7z Player.7z (796.6 Кб, 100 просмотров)
0
12 / 12 / 9
Регистрация: 16.05.2011
Сообщений: 109
12.01.2013, 13:21  [ТС] 5
Есть какие - нибудь мысли, догадки?
0
12.01.2013, 13:21
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.01.2013, 13:21
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru