Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.78 MB
Время: 0.13 c
15-1351516826
xayam
2012-10-29 17:20
2013.03.22
Ненужные идеи


15-1334142183
Сергей М.
2012-04-11 15:03
2013.03.22
Занимательная криптография


6-1266238609
zensan
2010-02-15 15:56
2013.03.22
TWebBrowser with FTP site


15-1332248400
Труп Васи Доброго
2012-03-20 17:00
2013.03.22
Кому не лень и не пофигу помогите


15-1348000202
Юрий
2012-09-19 00:30
2013.03.22
С днем рождения ! 19 сентября 2012 среда





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский