Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2013.03.22;
Скачать: CL | DM;

Вниз

Сжать график.   Найти похожие ветки 

 
RTF   (2012-10-10 16:45) [0]

Есть функция рисующая график
значений в зависимости от их амплитуды.

Как на рисунке:
http://imglink.ru/show-image.php?id=f5643b204cbe1b163a81fc8032b9c81f

Каждое из 4096 делений рисуется примерно так:


For i:= 0 to 4096-1 do
 DrawLine(i, ...);



Т.е. 1 деление - 1 вертикальная линия толщиной в 1 пиксель.
Получается, чтобы отобразить весь график, нужно создать битмап шириной в 4096 пикселей, иначе не влазит.

Вопрос такой:

Как отобразить ПОЛНОСТЬЮ этот график с другой шириной битмапа?
Допустим, ширина битмапа 600 пикселей и нужно весь график сжать до такого же размера.

Как это сделать?


 
MBo ©   (2012-10-10 16:58) [1]

Выполнить децимацию, т.е. взять часть значений - нужную долю, в данном случае примерно каждое седьмое значение

Если результат очень уж сильно не устроит, т.к. пропадёт часть важных значений, тогда уже думать о более сложных методах


 
картман ©   (2012-10-10 17:11) [2]


> Выполнить децимацию

жестоко


 
AV ©   (2012-10-10 17:15) [3]

можно брать первые Х линий, вычислять среднюю длину и рисовать ее, как одну линию
потом следующие X


 
alexdn ©   (2012-10-10 17:17) [4]

вот буквально недавно было - http://delphimaster.net/view/2-1347384231/


 
QAZ2   (2012-10-10 17:21) [5]


> alexdn ©   (10.10.12 17:17) [4]

поздравляю, самый тупой ответ !
при чем тут сжатие БМП?


 
Jeer ©   (2012-10-10 17:23) [6]


> Как это сделать?


Прежде всего задаться вопросом о физическом смысле усеченной картинки.

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


 
AV ©   (2012-10-10 17:31) [7]

аля так т.е.

http://imglink.ru/show-image.php?id=fbebca2e8516a5ae5e47ac32e415cbe0

 a: array [0..4096] of Integer;

implementation

{$R *.dfm}

procedure TForm1.btn1Click(Sender: TObject);
var
 i: integer;
 n: Integer;
begin
 for i := 0 to 4096 do
 begin
   a[i] := Round(30*Abs(Random(10)* Sin(i*pi/180)));
   pb1.Canvas.MoveTo(i,0);
   pb1.Canvas.LineTo(i,a[i]);
 end;
 for i := 0 to Round(4096/5) do
 begin
   n := Round((a[i*5] + a[i*5+1]+ a[i*5+2]+ a[i*5+3]+ a[i*5+4])/5);
   pb2.Canvas.MoveTo(i,0);
   pb2.Canvas.LineTo(i,n);
 end;
end;


 
Inovet ©   (2012-10-10 17:37) [8]

> [0] RTF   (10.10.12 16:45)
> DrawLine(i, ...);

Так неправильно рисовать.
Нарисуй таким методом синусоиду

For i:= 0 to 4096-1 do
DrawLine(i, sin(i * 2*Pi * (4096-10)/4096));

Что у тебя получится? А должно быть вот так
http://www.google.ru/#hl=ru&newwindow=1&sclient=psy-ab&q=sin%28x+*+2*Pi+*+%284096-10%29%2F4096%29&oq=sin%28x+*+2*Pi+*+%284096-10%29%2F4096%29&gs_l=hp.3...532752.538679.11.540192.3.3.0.0.0.0.195.519.0j3.3.0...0.0...1c.1. mJd_3VjCuxo&pbx=1&bav=on.2,or.r_gc.r_pw.r_qf.&fp=7c8de52227c38733&bpcl=35243188& biw=1198&bih=818

Кстати, давно ли Гугль стал рисовать графики функций? Я вчера только узнал, сын показал.

А по поводу впихивания в БМП больше чем может войти. Как? Да никак. Надо делать возможность масштабирования вывода.


 
alexdn ©   (2012-10-10 17:38) [9]

> QAZ2   (10.10.12 17:21) [5]
я имел в виду в основном FastLib, хотя оправдываться не люблю)


 
RTF   (2012-10-10 18:01) [10]


> Inovet ©   (10.10.12 17:37) [8]
>
> > [0] RTF   (10.10.12 16:45)
> > DrawLine(i, ...);
>
> Так неправильно рисовать.
> Нарисуй таким методом синусоиду


Зачем мне синусоида?


 
Jeer ©   (2012-10-10 18:04) [11]


> Как это сделать?


Если предположить, судя по картинке, что это некоторый оцифрованный сигнал, то:

1. Коэффициент децимации R = 4096/600 = 6.82
Примем R = 7
2. Пропустить сигнал через цифровой фильтр нижних частот с частотой среза Pi / R
3. Произвести децимацию, выделяя каждый 7-й отсчет.

Операции 2 и 3 можно объединить, использовав каскадный интегрально-гребенчатый фильтр Хогенауэра ( CIC-фильтр )


 
Inovet ©   (2012-10-10 18:11) [12]

> [10] RTF   (10.10.12 18:01)
> Зачем мне синусоида?

К твоему сведению. Любой сигнал можно представить сумой синусоид, так что - это простейший случай. Они у тебя есть, но ты об этом не знаешь, получается.

> [8] Inovet ©   (10.10.12 17:37)
> i * 2*Pi

2 лишняя
i * Pi


 
Jeer ©   (2012-10-10 18:20) [13]


> 2. Пропустить сигнал через цифровой фильтр нижних частот
> с частотой среза Pi / R


Если это совсем сложно, то в качестве ФНЧ использовать скользящее усреднение длиной 2*R = 14


 
Inovet ©   (2012-10-10 18:21) [14]

> [11] Jeer ©   (10.10.12 18:04)

Так после фильтра уже не то будет. Лучше всё видеть с нехваткой разрешения, как у автора, чем не всё. Именно так поставлена задача.


 
Jeer ©   (2012-10-10 18:25) [15]


> Так после фильтра уже не то будет. Лучше всё видеть с нехваткой
> разрешения, как у автора, чем не всё. Именно так поставлена
> задача.


Будет именно то, иначе алиасинг все исказит и можно увидеть даже черта лысого.


 
Jeer ©   (2012-10-10 18:29) [16]

Если у него шумовой сигнал ( белый шум ) - тогда да, фильтр не нужен, т.к. корреляционная функция уже на первом шаге равна нулю и можно децимировать, получая новый случайный процесс.
Но для этого можно просто вызывать Random нужное число раз ( 600 ) :)


 
Inovet ©   (2012-10-10 18:42) [17]

> [15] Jeer ©   (10.10.12 18:25)
> Будет именно то, иначе алиасинг все исказит

А, ну да, фильтр же и сделает масштабирование.


 
Inovet ©   (2012-10-10 18:54) [18]

> [0] RTF   (10.10.12 16:45)
> DrawLine(i, ...);

Гистограмма тогда уж. Именно её надо?


 
Inovet ©   (2012-10-10 19:21) [19]

> [17] Inovet ©   (10.10.12 18:42)
> А, ну да, фильтр же и сделает масштабирование.

Или нет. Что-то я туплю. Есть спектр, в нём выше частоты среза одна узкая полоска. После фильтра на графике сигнала получим везде 0, а надо везде закраску одинакой ширины.


 
Pavia ©   (2012-10-10 19:52) [20]

Есть множество способов, как отобразить график.
Причем как для уменьшения так при увеличения. И есть множество нюансов.
Какой правильный? Это зависит от того что вы хотите увидеть.

С моей точки зрения наиболее удовлетворяющей всех является.
Уменьшение при помощи поиска минимума и максимума на промежутке. А вот для увеличения использовать кубическую интерполяцию.


 
Inovet ©   (2012-10-10 20:03) [21]

> [20] Pavia ©   (10.10.12 19:52)
> Уменьшение при помощи поиска минимума и максимума на промежутке.

Вот. В свою очередь минимум и максимум искать не по представленным данным, как я уже сказал в
> [8] Inovet ©   (10.10.12 17:37)


 
RTF   (2012-10-10 20:09) [22]


>  Inovet ©   (10.10.12 18:54) [18]
>
> > [0] RTF   (10.10.12 16:45)
> > DrawLine(i, ...);
>
> Гистограмма тогда уж. Именно её надо?


Да, это гистограмма.
Спасибо за название.


> Pavia ©   (10.10.12 19:52) [20]


Вот изображение, которое получается путем
рисования, который я привел:

http://pixs.ru/showimage/Bezimyanni_7032009_6006010.jpg

Вот изображение той же гистограммы, но только более сжатой:

http://imglink.ru/show-image.php?id=f5643b204cbe1b163a81fc8032b9c81f

Как мне такую получить?


> Jeer ©   (10.10.12 18:04) [11]
>
>


Можно поподробнее о срезе и т.д.?


 
Pavia ©   (2012-10-10 20:17) [23]


procedure GetMaxMin(var Max,Min:TArraySmallint; InA:TArraySmallint; OutLength:Integer; InterpolationMode:Integer=0);
var OldLength:Integer;
FactorSize:Real;
MaxS,MinS:Smallint;
dt,T:Real;
i,j:Integer;
begin
OldLength:=Length(InA);
FactorSize:=(OutLength-1)/(OldLength-1);
SetLength(Max,OutLength);
SetLength(Min,OutLength);
if FactorSize<1 then {&#211;&#236;&#229;&#237;&#252;&#248;&#224;&#229;&#236;}
 begin
 {&#204;&#229;&#242;&#238;&#228; &#239;&#238;&#228;&#241;&#247;&#184;&#242;&#224; &#241;&#240;&#229;&#228;&#237;&#229;&#227;&#238; &#239;&#238; n=OutLength/NewLength}
 {&#205;&#224; &#234;&#240;&#224;&#229; &#239;&#240;&#232; &#239;&#238;&#228;&#241;&#247;&#184;&#242;&#229; &#241;&#240;&#229;&#228;&#237;&#229;&#227;&#238; &#232;&#241;&#239;&#238;&#235;&#252;&#231;&#243;&#229;&#242;&#241;&#255; &#235;&#232;&#237;&#229;&#233;&#237;&#238;&#229; &#232;&#237;&#242;&#229;&#240;&#239;&#238;&#235;&#232;&#240;&#238;&#226;&#224;&# 237;&#232;&#229;}
 dT:=FactorSize;
 MaxS:=0;
 MInS:=0;
 T:=0;
 j:=0;
 i:=0;
 While i<OldLength do
   begin
   if T+dT>1 then
     begin
     Max[j]:=MaxS;
     Min[j]:=MinS;
     T:=T+dT-1;
     if (InA[i]>MaxS) then
      begin
      MinS:=MaxS;
      MaxS:=InA[i];
      end
      else if (InA[i]<MinS) then
      begin
      MaxS:=MinS;
      MinS:=InA[i];
      end else
      begin
      MaxS:=InA[i];
      MinS:=InA[i];
      end;
     Inc(j);
     end else
     begin
     if InA[i]>MaxS then MaxS:=InA[i];
     if InA[i]<MinS then MinS:=InA[i];
     T:=T+dt;
     end;
   Inc(i);
   end;
 end else {FactorSize>1} {&#211;&#226;&#229;&#235;&#232;&#247;&#232;&#226;&#224;&#229;&#236;}
 begin
 ReSizeArray(Max,InA, OutLength,InterpolationMode);
 Min[0]:=Max[0];
 for i:=1 to OutLength-1 do
  Min[i]:=Max[i-1];
 for i:=1 to OutLength-1 do
  if Min[i]>Max[i] then
    begin
    MaxS:=Max[i];
    Max[i]:=Min[i];
    Min[i]:=MaxS;
    end;
 end;
end;

// Пример использования
procedure DrawWave;
var Data:TArraySmallint;
n, i,j:Integer;
Max,Min:TArraySmallint;
f:Real;
NewLength:Integer;
begin
n:=2000;
SetLength(Data,n);
//Randomize;
RandSeed:=5;
for i:= 0 to n-1 do
 Data[i]:={16000*((Round(i-0.5) div 3) mod 2);}
          {Round(10000*exp((i)*0.09)-32768);{}
          {Round(5000*Sin(6*2*Pi/n*i)+2);{}
{Round(5000*Sin(1/10*i)+(2*Random-1)*(32768-6000)); {}
Round(30000*sin(10*2*Pi*i/n));

NewLength:=Form1.Image1.Width;
GetMaxMin(Max,Min,Data,NewLength,imLine);
f:=Form1.Image1.Height/65536;
DrawAxis;
For i:=0 to NewLength-1 do
begin
Form1.Image1.Canvas.MoveTo(i,Form1.Image1.Height shr 1-Round(Max[i]*f));
Form1.Image1.Canvas.LineTo(i,Form1.Image1.Height shr 1-Round(Min[i]*f)+1);
end;
//DrawDataLine(Data);
{Form1.Image1.Picture.SaveToFile("pix.bmp");    }
end;


 
Pavia ©   (2012-10-10 20:20) [24]

Вот синусоида сжатая по t в  425/20000 раза

http://postimage.org/image/4nrp5yqdt/


 
RTF   (2012-10-10 21:59) [25]


> Pavia ©   (10.10.12 20:20) [24]


А попроще нет?


 
Inovet ©   (2012-10-10 22:22) [26]

> [25] RTF   (10.10.12 21:59)
> А попроще нет?

Синусоида 20000 Hz при частоте семплирования 44100 Hz в разном масштабе в Adobe Audition
http://s2.ipicture.ru/uploads/20121010/A6h69GdJ.jpg
Тут черти лысые появляются
http://s2.ipicture.ru/uploads/20121010/vbunR5sT.jpg
Тут нормально, зелёные прямоугольники обозначают реальные значения.
http://s1.ipicture.ru/uploads/20121010/S3Nlv6qy.jpg


 
RTF   (2012-10-10 23:33) [27]

> Pavia ©   (10.10.12 20:17) [23]
> GetMaxMin

Что делает эта функция?


> Inovet ©   (10.10.12 22:22) [26]
>
> > [25] RTF   (10.10.12 21:59)
> > А попроще нет?
>
> Синусоида 20000 Hz при частоте семплирования 44100 Hz в
> разном масштабе в Adobe Audition


Мне не нужна синусоида, нужна гистограмма.


 
Inovet ©   (2012-10-10 23:46) [28]

> [27] RTF   (10.10.12 23:33)
> Мне не нужна синусоида, нужна гистограмма.

Какая разница.


 
Inovet ©   (2012-10-10 23:49) [29]

> [28] Inovet ©   (10.10.12 23:46)

Что там в той гистограмме?


 
RTF   (2012-10-10 23:50) [30]


> Inovet ©   (10.10.12 23:49) [29]
>
> > [28] Inovet ©   (10.10.12 23:46)
>
> Что там в той гистограмме?


Которая на картинке по ссылке.
Пост 22.


 
Inovet ©   (2012-10-11 00:06) [31]

> [30] RTF   (10.10.12 23:50)

Что в ней?


 
RTF   (2012-10-11 03:00) [32]


> Inovet ©   (11.10.12 00:06) [31]
>
> > [30] RTF   (10.10.12 23:50)
>
> Что в ней?


Гистограмма музыкального трека.


 
RTF   (2012-10-11 03:12) [33]


> AV ©   (10.10.12 17:31) [7]


Ваш метод самый, как мне кажется, приемлемый.
Но я не понял

.
> Pavia ©   (10.10.12 20:17) [23]


Компилятор ругается:
ReSizeArray, imLine, DrawAxis и т.д.


 
Inovet ©   (2012-10-11 05:25) [34]

> [32] RTF   (11.10.12 03:00)
> Гистограмма музыкального трека.

Звук обычно показывают графиком "уровень/время", спектр - гистограммой "уровень/частота". Так что синусоида очень даже в тему, в которую надо бы начинать вникать.


 
MBo ©   (2012-10-11 05:25) [35]

[1] пробовал?


 
Inovet ©   (2012-10-11 05:29) [36]

> [35] MBo ©   (11.10.12 05:25)

Да он велосипед изобретает, даже не посмотрев конструкции у конкурентов.


 
Pavia ©   (2012-10-11 06:27) [37]


> А попроще нет?

Можно и проще берешь каждый n-ное значение и выводишь.
Только оно плохо выглядить будет. Даже среднее плохо выглядит. Гораздо нагляднее искать максимум и минимум.

То что ругается так вы сами увеличение не просили так что ReSize надо выкинуть. DrawAxis; - рисует оси это сами добавите.


 
Pavia ©   (2012-10-11 06:34) [38]


> Inovet ©   (10.10.12 22:22) [26]

У меня мой алгоритм дает такие же результаты как и ваш Adobe Audition

Единственное что я не согласен с тем что надо строить синусойду(такая возможность у меня имеется) при интерполяции. Это неверно. Между точками мы можем провести кривую любым способом.

То что обычно рисуют при интерполяции синусойду ну пусть ресуют только вот только если данные получены с реальной синусойдоы с малым числом точек, то фазу правильно построить у сенусойды не получится. Да и с амплитудой будет косяк в несколько процентов.

Может кого-то это устраивает, но меня нет.


 
Павиа   (2012-10-11 07:13) [39]

Продолжая тему. Как я уже сказал интерполяция это попытка одгадать что лежит между точками. Если у нас есть наперёд известные данные о сигнали то моюно подобрать такой способ интерполяции который будет наиболее близок к желаемому.  Вот тут и кроется заблуждение вы падаете на вход синусойду и ожидаете синусойду. А подайте не синусойду а к примеру меандер(п-образный сигна) или лучше экспоненту. В результате вы не получите желаемого у вас будут непонятные волны.


 
Inovet ©   (2012-10-11 07:53) [40]

> [38] Pavia ©   (11.10.12 06:34)
> как и ваш Adobe Audition

Оно Adobe

> [38] Pavia ©   (11.10.12 06:34)
> Единственное что я не согласен с тем что надо строить синусойду(такая
> возможность у меня имеется) при интерполяции. Это неверно.
> Между точками мы можем провести кривую любым способом.

На картинках синусоида, потому что там действительно синусоида, я же написал какая, было бы другое, и апроксиморовалось бы иначе. Картинку я привёл к пояснению [8]. Построй по точкам - получишь фигню.


 
Inovet ©   (2012-10-11 07:56) [41]

> [39] Павиа   (11.10.12 07:13)
> Вот тут и кроется заблуждение вы падаете на вход синусойду
> и ожидаете синусойду. А подайте не синусойду а к примеру
> меандер(п-образный сигна) или лучше экспоненту. В результате
> вы не получите желаемого у вас будут непонятные волны.

Не бывает прямоугольных сигналов, всегда волны и будут.


 
Inovet ©   (2012-10-11 08:02) [42]

На тебе прямоугольник 20000 Гц
http://s1.ipicture.ru/uploads/20121011/ueQVh5rr.jpg


 
Inovet ©   (2012-10-11 08:06) [43]

На тебе  две синусоиды 13333 и 20000
http://s2.ipicture.ru/uploads/20121011/9ADNuVH0.jpg


 
han_malign   (2012-10-11 08:43) [44]


> На тебе  две синусоиды

- уперся блин - нафиг не нужны никакие фильтры и интерполяции при отображении осциллограммы оцифрованного звука...
Нужно тупо красиво нарисовать огибающую не потеряв информативности при отображении большого куска сигнала в один пиксель полосу...

Как видно на рисунке это делается полутонами, и по сути напоминает закрашивание карандашом линии с амплитудой сигнала...

 1        1
111       3
1111  ==> 4
111       3
 11       2


 
Inovet ©   (2012-10-11 08:48) [45]

> [44] han_malign   (11.10.12 08:43)
> Нужно тупо красиво нарисовать огибающую

При масштабе меньше разрешения так и будет, выше обсуждали как, при достаточном разрешении надо апроксимировать иначе будеьт фигня,. Тут же пытаются доказать обратное.


 
Inovet ©   (2012-10-11 08:53) [46]

> [44] han_malign   (11.10.12 08:43)
> Как видно на рисунке это делается полутонами, и по сути
> напоминает закрашивание карандашом линии с амплитудой сигнала

Да хоть в цветочек с горошком, какая разница как он там разукрасит, важно что разукрашивать.


 
han_malign   (2012-10-11 09:11) [47]


> при достаточном разрешении надо апроксимировать

- не будет там достаточного разрешения, потому что 20-ти минутный трек кусками по 10 миллисекунд никто разглядывать не будет, тем более при воспроизведении в реальном времени...

З.Ы. Частотную составляющую все-таки надо бы учитывать, т.к. ужимаем и по амплитуде тоже
- *        -
    *      2
-     *    -
           1/2
-          -
           1/2
-       *  -

- но тут линейной интерполяции - за глаза...


 
Pavia ©   (2012-10-11 09:16) [48]


> Inovet ©   (11.10.12 08:02) [42]

Я отвас больше экспоненту хотел видить.
но ладно вот вам табличка сигналы и их отоброжения в зависимости от интерполяци
http://postimage.org/image/ad4zw4hav/full/
Налучшей результат находится на диаганали.
Красными линиями показано значение в точке.


 
han_malign   (2012-10-11 09:36) [49]


> важно что разукрашивать

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


 
Jeer ©   (2012-10-11 12:10) [50]

Это обычная задача DSP и не наду тут "разводить кроликов" насчет "красивше".
Решать ее надо правильными методами, основанными на теории обработки сигналов, тогода будет и правильно и "красивше".

Интерполяция тут при чем ?

Стоит задача децимации, т.е. уменьшения частоты дискретизации.
Инженерным или научным ( как хотите ) методом является именно предварительная фильтрация, затем децимация или как показано мной выше совмещение операций фильтрации и децимации на CIC-фильтрах.

Пример 1.

http://s017.radikal.ru/i440/1210/5f/2ed7dac76240.jpg

Серый - исходный сигнал, полученный из белого шума формирующим фильтром ( ФНЧ первого порядка ), аналог звукового сигнала.
Черный - децимация 1:100 исходного ( серого ) сигнала.
Красный - фильтрация исходного сигнала скользящим усреднением, т.е. выделение НЧ-составляющей для обеспечения нормальной децимации.

Как видим, черный и близко не лег к основной НЧ составляющей.

Пример 2.

http://s47.radikal.ru/i117/1210/56/be776ec7d2cc.jpg

Серый и красный - тоже самое, а черный - децимация 1:100 отфильтрованного ( красного ) сигнала.
Совпадение более, чем удовлетворительное при столь высокой децимации.


 
Inovet ©   (2012-10-11 13:02) [51]

> [48] Pavia ©   (11.10.12 09:16)
> Налучшей результат находится на диаганали.

Да вот в трёх приведённыйх примерах наиболее близкий к реальности будет sine. Некрасивый, но правдивый.


 
Inovet ©   (2012-10-11 13:05) [52]

> [47] han_malign   (11.10.12 09:11)
> - но тут линейной интерполяции - за глаза...

Может быть, но мин макс лучше.


 
Inovet ©   (2012-10-11 13:14) [53]

> [50] Jeer ©   (11.10.12 12:10)
> и не наду тут "разводить кроликов" насчет "красивше"

Как раз задача и стоит красивше, а не правильнее. Ну типа - визуализировать звуковую дорожку, как сфотографировать канавку на грамластинке или осциллограмму, а потом понизить разрешение фотографии. Никто по ней не будет определять параметры сигнала, достаточно видеть где тише, где громче для навигации, а больше и не надо. С ФНЧ этого как раз не будет видно.


 
Inovet ©   (2012-10-11 13:16) [54]

> [47] han_malign   (11.10.12 09:11)
> - не будет там достаточного разрешения, потому что 20-ти
> минутный трек кусками по 10 миллисекунд никто разглядывать
> не будет

Не будет - и хрен с ним. А если будет, так надо сделать нормально.


 
Inovet ©   (2012-10-11 13:27) [55]

> [53] Inovet ©   (11.10.12 13:14)
> визуализировать звуковую дорожку

Кстати, на киноплёнке её и так видно.
http://upload.wikimedia.org/wikipedia/commons/thumb/4/4c/35_mm_RUS.svg/2000px-35_mm_RUS.svg.png?uselang=ru


 
Pavia ©   (2012-10-11 13:28) [56]


> Да вот в трёх приведённыйх примерах наиболее близкий к реальности
> будет sine. Некрасивый, но правдивый.

Ошибаетесь.
Торт состоит из коржей хотя разрезается на дольки(куски).
вы просто привыкли видеть его разрезанным.
Также и с синусойдами. Отсюда  вас и неправильное представление о реальности.


 
Inovet ©   (2012-10-11 13:37) [57]

> [56] Pavia ©   (11.10.12 13:28)
> Также и с синусойдами. Отсюда  вас и неправильное представление о реальности.

Хорошо, смотрим диагональ.
Прамоугольник.
1. при такой частоте выборок невозможны столь крутые фронты и спады.
2. Лучше, но углы торчат, тоже не может быть.
3. Правдиво

Экспонента.
1. На краях не может быть так, ещё и прямоуггольная.
2. Края не реальные.
3. Правдиво

Синусоида.

1. Даоеко от реальности в квадрате.
2. Получше, но углы не бывают.
3. Правдиво


 
Inovet ©   (2012-10-11 14:04) [58]

> [53] Inovet ©   (11.10.12 13:14)
> визуализировать звуковую дорожку

Пример визуализации со спектром
Тхе Беатлес - Йестырдей
http://s2.ipicture.ru/uploads/20121011/vJjZBlEh.jpg
с этого mp3
http://muzyaka.com/song/851


 
Jeer ©   (2012-10-11 14:49) [59]

Фантазируем дальше.
Предположим у ТС не стоит задача децимации.
У него задача показать огибающую по уровню громкости.
В этом случае, все упрощается - достаточно использовать простейшую цифровую модель амплитудного детектора.
Как мы помним - это диод и конденсатор + цепь разрядки.
Значит, моделируем диод и разное время зарядки и разрядки.

Для "диода" достаточно abs()
Конденсатор с разными постоянными времени моделируется ФНЧ первого порядка с изменяемой, в зависимости от направления тока, постоянной времени.

http://s017.radikal.ru/i406/1210/a5/661c447bec6b.jpg

Т.е. мы произвели амплитудное детектирование AM-сигнала, где в качестве несущей частоты (частот)  выступает спектр звукового сигнала.

Модель чрезвычайно проста и физична, в отличии от геометрических построений, а главное - давно отработана в радиоприемниках.

Ее можно, улучшать вводя адаптивность постоянной времени от уровня рассогласования, использовать каскадное соединение ФНЧ первого порядка или фильтр втрого порядка.

// arY[] - массив входных данных
// arYF[] - отфильтрованный массив
// A - эквивалент постоянной времени

 Yi := 0;
 for i := 0 to High(arY) do begin
   Ya := abs(arY[i]); \\ "выпрямление"
   if Yi < Ya then A := 0.05 \\ моделирование времени заряда-разряда
   else A:= 0.003;
   Y := A*Ya + (1-A)*Yi; \\ фильтр
   Yi := Y; \\ фильтр
   arYF[i] := Y;
 end;

Децимация проходит на ура
http://s019.radikal.ru/i621/1210/b9/526a1022b928.jpg


 
Jeer ©   (2012-10-11 14:59) [60]

Наконец, после "амплитудного детектора" ставим такой же простейший ФНЧ и получаем вполне сносное и физически обоснованное видение процесса:

http://s017.radikal.ru/i412/1210/e2/2a8157e3f023.jpg

  A - const
  Y := A*Ya + (1-A)*Yi; \\ фильтр
  Yi := Y; \\ фильтр


 
Jeer ©   (2012-10-11 15:02) [61]

К огибающему сигналу после его децимации вообще претензий нет
http://s019.radikal.ru/i636/1210/b4/272450e61768.jpg


 
Jeer ©   (2012-10-11 15:06) [62]

Могу еще пофантазировать, что ТС, говоря о гистограмме ( а не тренде ), имел в виду визуализацию спектра сигнала :)

Тут все просто до безобразия (если не заморачиваться с вейвлетами):
- медленный и тупой DFT;
- быстрый и умный FFT;
- сверхбыстрый и хитрый Герцель ( Goertzel )

+ гистограмма, то бишь столбики.


 
Inovet ©   (2012-10-11 15:16) [63]

> [62] Jeer ©   (11.10.12 15:06)
> Могу еще пофантазировать, что ТС, говоря о гистограмме (
> а не тренде ), имел в виду визуализацию спектра сигнала :)

Это вряд ли.:)
С детектором похоже на то. Интересно как обычно делают в том же Аудишн, да и везде они похоже выглядят. Что-то мне думается, фильтр они не ставят - меставми выбросы видно.


 
Inovet ©   (2012-10-11 15:22) [64]

> [59] Jeer ©   (11.10.12 14:49)

Насчёт времён заряда и разряда. Это в аналоге так, а в цифре можно в ближайшее будущее подсмотреть, чтобы ровнее было. Нет?


 
Jeer ©   (2012-10-11 15:27) [65]

Вот вариант с адаптивной подстройкой времени заряда-разряда

var
 i: integer;
 Ya, Y, Yi, A, K: TFloat;
 function _Adaptive(const k, dX: TFloat): TFloat;
 begin
   Result := k * (0.01 + abs(dX));
 end;

begin
 Yi := 0;
 for i := 0 to High(arY) do begin
   Ya := abs(arY[i]);
   if Yi < Ya then K := 0.5
   else K := 0.01;
   A := _Adaptive(K, Yi - Ya);
   Y := A * Ya + (1 - A) * Yi;
   Yi := Y;
   arYF[i] := Y;
 end;
end;

Тут обошлись одним фильтром с подстраиваемой T

http://i053.radikal.ru/1210/c9/398e969f7a46.jpg


 
Jeer ©   (2012-10-11 15:39) [66]


> Это в аналоге так, а в цифре можно в ближайшее будущее


Это и в цифре и а аналоге одинаково, если онлайн обработка.
Тот алгоритм, что я привел как аналог AM - легко применяется для онлайн обработки.
Если данные уже получены в виде некоего массива - можно улучшать до бесконечности.


 
Pavia ©   (2012-10-11 15:40) [67]


> Хорошо, смотрим диагональ.Прамоугольник.1. при такой частоте
> выборок невозможны столь крутые фронты и спады.2. Лучше,
>  но углы торчат, тоже не может быть.3. ПравдивоЭкспонента.
> 1. На краях не может быть так, ещё и прямоуггольная.2. Края
> не реальные.3. Правдиво

Прямоугольной может быть и есть.  А то что АЦП выступает в роле фильтера это вопрос второй.
Да мы можем подогнать под АЦП скругив. Но гораздо наглдее и реальне прямоугольные.


 
Inovet ©   (2012-10-11 16:04) [68]

> [67] Pavia ©   (11.10.12 15:40)

Ну ты понял. Или абстракция с идеализацией и с бесконечно высокой скоростью выборок, или реальность - то, что будет на выходе. Даже без АЦП сгенерировали красивые прямоугольники, а на выходе ЦАП+ФНЧ от них может остаться, в зависимости от частоты, отдалённо похожее на идеал, а то и синусоида.


 
han_malign   (2012-10-11 16:17) [69]


> А если будет, так надо сделать нормально.

- нормальная визуализация - это максимально информативная с минимальным искажением входных данных...
Это вообще может быть не оцифровка аналогового сигнала, а любая дискретная выборка - например почасовой счетчик срабатываний турникета за последний год, или плотность сетевого трафика, или гистограмма распределения на большом динамическом диапазоне(тот же спектр) - и `тут не надо "разводить кроликов"` и резать или выдумывать промежуточные отсчеты...


> Это обычная задача DSP

- DrawLine(i, ...); - уга, ага - классическая задача обработки сигналов, может еще и преобразование Фурье для построения огибающей сделать?

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


 
Jeer ©   (2012-10-11 16:30) [70]


>  DrawLine(i, ...); - уга, ага - классическая задача обработки
> сигналов


Передергивать не надо. Drawline - это метод рисования, а не обработки.
Привыкли, панимаешь, к геометрии :)


> это максимально информативная с минимальным искажением входных
> данных.


Критерии информативности и минимальности - в студию.
А так - это просто треп.


 
Jeer ©   (2012-10-11 16:34) [71]


> А то что АЦП выступает в роле фильтера это вопрос второй.
>  


Это где Вам такое приснилось ? :)


 
Inovet ©   (2012-10-11 17:01) [72]

> [69] han_malign   (11.10.12 16:17)
> Это вообще может быть не оцифровка аналогового сигнала,
> а любая дискретная выборка

Автор, после несколько раз заданного наводящего вопроса, ответил, что там такое. Но и для физически иных данных не факт, что не надо. И турникет, и трафик тоже могут в обе стороны работать - методы годятся, либо, в особых случаях, в одну сторону - "всех впускать, никого не выпускать" - с постоянной составляющей, когда-то всё равной выпустят, но может уже в другом качестве - другие методы.


 
Pavia ©   (2012-10-11 18:59) [73]


> Это где Вам такое приснилось ? :)

Может я немного не правильно выразился.
Во-первых АЦП отсекает частоты которые ниже частоты дискретизации.
Во-вторых АЦП состоит из конденсатора и компараторов. Так вот конденсатор и выполняет роль фильтера.


 
Inovet ©   (2012-10-11 19:08) [74]

> [73] Pavia ©   (11.10.12 18:59)

Оба постулата неверны


 
Игорь Шевченко ©   (2012-10-11 19:51) [75]

В-третьих, у него внутре неонка


 
Jeer ©   (2012-10-11 20:29) [76]


> Во-первых АЦП отсекает частоты которые ниже частоты дискретизации.
>
> Во-вторых АЦП состоит из конденсатора и компараторов. Так
> вот конденсатор и выполняет роль фильтера.


Оба-на, а народ-то и не знал, откуда выдирать конденсаторы.
Пойду гляну на свои запасы АЦП - наверняка сотню кондеров из них щипчиками по-вытаскиваю.

По делу:
Правильным применением любого АЦП, как функционального узла, является применение его в совокупности с предварительным аналоговым фильтром НЧ, для удаления частот выше частоты Найквиста ( теорема Котельникова ).

Из чего конкретно состоит тот или иной АЦП - это второй вопрос, архитектурный и "кондеров" там может не быть вообще :)

Но, именно такая связка ФНЧ + АЦП будет работать технически грамотно.


> В-третьих, у него внутре неонка


+100500 :)


 
han_malign   (2012-10-12 09:15) [77]


> Критерии информативности и минимальности - в студию.

- вы человек ученый - вам поток звуковой энергии интересен, но ведь есть люди которым и импульсные выкидыши важны - а вы их все сгладить норовите...

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

Информативность
Простой пример: чистая гармоника - на эскизе заведомо сливается в полосу, т.е. огибающая - прямая.
Но, если построить правильное полутоновое изображение - крутизна градиента цвета фактически соответствует крутизне фронта волны - можно прикинуть частоту, увидеть биение частот - фактически можно отобразить FM-радио "в оригинале"...

Еще проще: набор чистых цифровых стробов - по интенсивности цвета выкидышей на эскизе можно легко прикинуть наличие и ширину посылок...

Изначально стояла задача нарисовать эскиз осциллограммы сигнала, а не смоделировать какой либо тракт обработки этого сигнала...
А при построении эскизов - применяются алгоритмы обработки изображения, а не звука...


 
Inovet ©   (2012-10-12 09:23) [78]

> [77] han_malign   (12.10.12 09:15)
> даже по Вашим Высшим законам

Законы природы безличностны и действуют для всех одинаково, в отличие от личных фантазий. Не так давно была ветка на тему цифровых сигналов, там тоже разговоры шли о вымышленных красивостях. Другое дело, когда красивость нужна для красивости, пусть при этом как раз потеряется объективность и будут внесены искажения. Это уже художества, не плохо, нет, но надо понимать разницу и область применения.


 
Inovet ©   (2012-10-12 09:29) [79]

Вот в посте
> [58] Inovet ©   (11.10.12 14:04)

картинка - это же не для красивости в плеере сделана, а для работы. Например, можно из спектра взять прямоугольную область и применить затем в фильтре.


 
Inovet ©   (2012-10-12 09:37) [80]

> [79] Inovet ©   (12.10.12 09:29)

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


 
han_malign   (2012-10-12 09:37) [81]


> Это уже художества, не плохо, нет, но надо понимать разницу
и область применения.


> Сжать график.

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


 
Inovet ©   (2012-10-12 09:39) [82]

> [81] han_malign   (12.10.12 09:37)

Ну так для того и нужна, а что там ещё с ней можно делать особо на большом масштабе, на малом я написал выше.


 
han_malign   (2012-10-12 09:39) [83]


> правильный реальный результат, а не какая-то идилия.


 
Inovet ©   (2012-10-12 09:41) [84]

> [83] han_malign   (12.10.12 09:39)

Ну так выше обсуждали, что там как раз неправильно - всё в каких-то синусоидах, а надо прямоугольники типа.


 
Jeer ©   (2012-10-12 09:43) [85]


> но ведь есть люди которым и импульсные выкидыши важны -
> а вы их все сгладить норовите..


Все зависит от задачи. Сделать "правильными" методами можно и нужно.


> Но, если построить правильное полутоновое изображение -
> крутизна градиента цвета


Это уже художества, которые и если определены в задаче, то имеют право на жизнь.


> Изначально стояла задача нарисовать эскиз осциллограммы
> сигнала


Изначально ТС попросил объяснить, как уменьшить разрешение.
Это стандартная задача обработки данных и не важно, звуковой это сигнал или сейсмограмма или курс доллара.

Визуализация идет после, второй задачей.


> А при построении эскизов


Применяется карандаш :)


 
Inovet ©   (2012-10-12 09:43) [86]

А автор ветки вон вообще заявляет - мне не надо синусоиды, мне надо гистограмму. Что уж там в голове у него за этими словами, можно лишь догадываться.


 
Jeer ©   (2012-10-12 09:44) [87]


> интереснее различать слова, фразы, DTMF


Это задача распознавания и к "сжать график" имеет очень мало отношения.


 
Jeer ©   (2012-10-12 09:46) [88]


>  мне надо гистограмму


Да не вопрос, можно отрисовать тренд не lineto() от точки к точке, а именно столбиками - это метод визуализации.


 
Inovet ©   (2012-10-12 09:53) [89]

> [81] han_malign   (12.10.12 09:37)
> Лично мне и нашим клиентам в осциллограмме 20-минутного
> телефонного разговора

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


 
Jeer ©   (2012-10-12 09:54) [90]

Пожалуйста - тот же сигнал после децимации, но построенный гистрограммой

http://s017.radikal.ru/i412/1210/dd/190174ab5e0c.jpg


 
Inovet ©   (2012-10-12 09:56) [91]

> [90] Jeer ©   (12.10.12 09:54)

Вот бы ещё автору бы понять - что же он хочет.


 
Jeer ©   (2012-10-12 10:04) [92]

Да мы тут давно уже друг с другом заспорились, а ТС испугался всех этих сложностей и сбежал :)

Ладно, break.


 
Pavia ©   (2012-10-12 11:00) [93]


> > [77] han_malign   (12.10.12 09:15)> даже по Вашим Высшим
> законам Законы природы безличностны и действуют для всех
> одинаково, в отличие от личных фантазий. Не так давно была
> ветка на тему цифровых сигналов, там тоже разговоры шли
> о вымышленных красивостях. Другое дело, когда красивость
> нужна для красивости, пусть при этом как раз потеряется
> объективность и будут внесены искажения. Это уже художества,
>  не плохо, нет, но надо понимать разницу и область применения.
>


Неплохо понимать разницу между законами природы. И математическими моделями.


 
Jeer ©   (2012-10-12 11:02) [94]

Между законами природы мы разницу понимаем, например между первым и вторым законом Ньютона.

Между математическими моделями - тоже. :)


 
Pavia ©   (2012-10-12 11:03) [95]


> Это стандартная задача обработки данных и не важно, звуковой
> это сигнал или сейсмограмма или курс доллара.

Ещё как важно. Одни мадели могут быть не применимы в других облостях. Для этого требуется доказательство физического оподобия.


 
Игорь Шевченко ©   (2012-10-12 11:05) [96]


> Одни мадели могут быть не применимы в других облостях


Spellchecker rulezz fareva!


 
Jeer ©   (2012-10-12 11:12) [97]


> Одни мадели


> облостях


С этим мне трудно спорить - не обучен.


 
Inovet ©   (2012-10-12 11:17) [98]

> [93] Pavia ©   (12.10.12 11:00)
> Неплохо понимать разницу между законами природы. И математическими моделями.

Ну и? Модели с разной точностью описывают законы.

Не знаю, насколько правдива история. Как-то на заре радиосвязи радиолюбители начали экспериментировать с модуляцией для передачи голоса. Математики им сказали у вас там будет две боковых полосы, они не верили - дескать это у вас в математике модели такие, в реальности не может быть две, мы же одну передаём. Неверили, пока сами не наступили.


 
Pavia ©   (2012-10-12 11:19) [99]


> Spellchecker rulezz fareva!

То есть то отключается :(

Ещё как важно. Одни модели могут быть применимы в одних областях и не применимы в других. Чтобы применить модель надо доказать физическое подобие областей.
И это не всё. Также возможность применения модели зависят от масштаба.  К примеру ОТО и Ньютоновская механика.


 
Jeer ©   (2012-10-12 11:50) [100]


> К примеру ОТО и Ньютоновская механика.


О, куда потянуло, а тут еще черные силы и материи подоспели - куды бежать ?


 
RTF   (2012-10-12 20:28) [101]


> Inovet ©   (12.10.12 09:56) [91]
>
> > [90] Jeer ©   (12.10.12 09:54)
>
> Вот бы ещё автору бы понять - что же он хочет.

Вывод waveform музыкального трека, в виде гистограммы, а
не в виде синусоиды. Если из далека смотреть на
waveform в том же Adobe Audiere, т.е. от обычной столбчатой гистограммы
не отличить.

> <Цитата>
>
> Jeer ©   (12.10.12 10:04) [92]
>
> Да мы тут давно уже друг с другом заспорились, а ТС испугался
> всех этих сложностей и сбежал :)
>
> Ладно, break.


Самое приемлимое это вывод среднего арифметического
из некоторого диапазона графика.
Ща доделаю и покажу. (Может быть :))

Точность не важна, нужно сделать лишь красивую картинку полного
waveform на битмапе.

Больше пока ничего.


 
Jeer ©   (2012-10-12 22:35) [102]


> Самое приемлимое


Кроме Вас никто не знает, что Вам "приемлемо".


 
Jeer ©   (2012-10-12 22:36) [103]


> Точность не важна,


Можно подумать, Вы что-то о точности говорили.
Вы даже два слова о задаче с трудом связали :)


 
Jeer ©   (2012-10-12 22:46) [104]


> Больше пока ничего.


Да мы тут давно уже о своем, а не о Вашем говорим.
Успеха в изысканиях.


 
SergeyIT ©   (2012-10-12 23:35) [105]

Как то непонятно в чем проблема... Когда то писал редактор звуковых файлов (типа cool) и с отрисовкой была проблема только со скоростью (D1, PC 486).


 
RTF   (2012-10-12 23:41) [106]

> Jeer ©   (12.10.12 22:35) [102]
> Самое приемлимое
> Кроме Вас никто не знает, что Вам "приемлемо".

Приемлимое из предложенных же.


> SergeyIT ©   (12.10.12 23:35) [105]
>
> Как то непонятно в чем проблема... Когда то писал редактор
> звуковых файлов (типа cool) и с отрисовкой была проблема
> только со скоростью (D1, PC 486).
>


Как сжимали?


 
SergeyIT ©   (2012-10-12 23:52) [107]


> Как сжимали?

Отображал как в других редакторах звуковых файлов. Загрузи и посмотри


 
Inovet ©   (2012-10-12 23:55) [108]

> [101] RTF   (12.10.12 20:28)
> Вывод waveform музыкального трека, в виде гистограммы, а
> не в виде синусоиды.

Так я и знал - своя специфическая терминология, чтобы враг не догадался. Осциллограмму называем синусоидой.

> [101] RTF   (12.10.12 20:28)
> Если из далека смотреть на
> waveform в том же Adobe Audiere, т.е. от обычной столбчатой
> гистограммы не отличить.

Audiere - это на каком языке?
Понятно - нужна осциллограмма.

> [101] RTF   (12.10.12 20:28)
> Ща доделаю и покажу. (Может быть :))

Давай.



Страницы: 1 2 3 вся ветка

Текущий архив: 2013.03.22;
Скачать: CL | DM;

Наверх




Память: 0.8 MB
Время: 0.125 c
15-1333152359
wl
2012-03-31 04:05
2013.03.22
а нет ли программы, которая...


2-1332844142
TSubject
2012-03-27 14:29
2013.03.22
Delphi ODAC и Русские имена полей


2-1347011404
alexdn
2012-09-07 13:50
2013.03.22
Текст на картинку (канву)


15-1332944670
SiDimka
2012-03-28 18:24
2013.03.22
как передать объект из динамически загружеамой dll


15-1337113805
Юрий
2012-05-16 00:30
2013.03.22
С днем рождения ! 16 мая 2012 среда