Преобразование Гильберта на асме, срочно надо!

Тема в разделе "WASM.ASSEMBLER", создана пользователем alex_maslakov, 15 окт 2009.

Статус темы:
Закрыта.
  1. alex_maslakov

    alex_maslakov New Member

    Публикаций:
    0
    Регистрация:
    15 окт 2009
    Сообщения:
    16
    Необходимо выполнить преобразование Гильберата на ассемблера, в частности на MMX.
    1. Какова формула преобразование Гильберата?
    2. Как привести ее к виду, чтобы можно было выполнить на ассемблере - т.е. максимально все упростить, избавиться от sin и cos, если они есть, заменить их константами...
     
  2. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.552
    Адрес:
    Russia
    Может вы имели ввиду преобразование Гильберта?
    Формулы гуглятся, как минимум википедия.
    Вот вы спросили про синусы и косинусы, но вы же формулы не видели? :)
    Там интеграл. Достаточно описать процесс преобразования и дальнейшего решения интеграла.
    Можно почитать "численные методы". Плюс ищите все что связано с интегральной формулой Коши.
    Почему выбран ММХ? Чем FPU не устраивает?
    За вас здесь врятли кто-то писать будет. Но на мысли я вас направил. Думайте.
     
  3. cppasm

    cppasm New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    923
    http://ru.lmgtfy.com/?q=преобразование+Гильберта
     
  4. Freeman

    Freeman New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2005
    Сообщения:
    1.385
    Адрес:
    Ukraine
    а что у вас собственно не получаецо?

    есле вы хотите, чтоб ктото сел, взял учебнек (нагуглил), за вас разобрался с разложением реального сигнала в комплексный, после чего взял нужный вам компилятор, написал под него код, который должен обрабатывать данные в указанном вами формате, с использованием ММХ, то вам скорее сюда https://wasm.ru/forum/viewforum.php?id=26
     
  5. alex_maslakov

    alex_maslakov New Member

    Публикаций:
    0
    Регистрация:
    15 окт 2009
    Сообщения:
    16
    Ну да, гугляться, да, там есть интеграл.

    Мне надо так преобразовать формулу, чтобы там были (как бы так сказать?) простые действия, операции, которые есть в ассемблере, т.е. от интегралов, синусов, косинусов и т.п. перейти к той форме, исходя из которой уже можно формулу эту преобразовать в прогу на асме.
     
  6. Com[e]r

    Com[e]r Com[e]r

    Публикаций:
    0
    Регистрация:
    20 апр 2007
    Сообщения:
    2.624
    Адрес:
    ого..
    ну так ты бы дал в таком случае исходную формулу, мы бы вместе сели и подумали, а то вот к примеру я с первого раза ничего однозначного не нагуглил (особенно с исковерканной фамилией математика), а желание помочь было.
     
  7. alex_maslakov

    alex_maslakov New Member

    Публикаций:
    0
    Регистрация:
    15 окт 2009
    Сообщения:
    16
    Результат преобразования Гильберта во временной области через частотную область:

    (t) =(f)×exp(j2pft) df =X(f)×Hb(f)×exp(j2pft) df
     
  8. alex_maslakov

    alex_maslakov New Member

    Публикаций:
    0
    Регистрация:
    15 окт 2009
    Сообщения:
    16
    То есть вот уже преобразованная
    hb(k дельтаt) = 2/(П k дельтаt), при k = +-1, +-3, +-5, ...
     
  9. alex_maslakov

    alex_maslakov New Member

    Публикаций:
    0
    Регистрация:
    15 окт 2009
    Сообщения:
    16
  10. FatMoon

    FatMoon New Member

    Публикаций:
    0
    Регистрация:
    28 ноя 2002
    Сообщения:
    954
    Адрес:
    Russia
    alex_maslakov
    А нечего тут апать. Представь себе разочарование десятков посетителей, которые заглядывают сюда в надежде увидеть толковый алгоритм преобразования Гилберта... а видят что?
    Сообщение не в ту ветку. При чем тут ассемблер? Что, сложный или интересный случай? Нет. Вообще никакого кода не приведено. Если бы написал хотя бы на бейсике и просил перевести на ассемблер, был бы разговор. А так оно просто просится либо в удаление, либо в COMMERCE - учитывая требуемое исполнителю специальное образование и срочность, баксов на 250 минимум задача тянет =)
     
  11. ConstZ

    ConstZ New Member

    Публикаций:
    0
    Регистрация:
    18 фев 2008
    Сообщения:
    42
    Предполагаю, что "студенческая" задача на $250 как-то не тянет...
    Вероятно, топикстартеру всё таки нужно Дискретное преобразование Гильберта, а оно реализуется антисимметричным КИХ-фильтром. Коэффициенты фильтра по заданным требованиям поможет подобрать алгоритм им.Е.Я.Ремеза и, например, Matlab.
     
  12. FatMoon

    FatMoon New Member

    Публикаций:
    0
    Регистрация:
    28 ноя 2002
    Сообщения:
    954
    Адрес:
    Russia
    ConstZ
    тянет, тянет. Я вот не знаю, что такое преобразование Гильберта. Мне надо потратить время на чтение, разборки с формулами, написание алгоритма, отладку (то есть надо иметь нормальную подборку исходных данных, и знать, что получится в результате, чтобы сравнить). А потом перевести на ассемблер. Это по времени - пара недель, не меньше (скорее, ближе к 3-м, и половину времени займет поиск и чтение литературы). Если кто-то может быстрее, потому что уже знает что такое Гильберт - это не значит, что цена вопроса меньше. Просто такому специалисту будет проще их заработать :))))) Скоро студенты будут просить FFT за бесплатно, или даже уравнение Шредингера на асме посчитать за спасибо, ага.
     
  13. alex_maslakov

    alex_maslakov New Member

    Публикаций:
    0
    Регистрация:
    15 окт 2009
    Сообщения:
    16
    Есть код на дельфях. Надо перевести на асм. Некоторые процедуры не указаны - они рисуют, выводят график - это не имеет значения. Важен алгоритм.


    Код (Text):
    1. var
    2.   Form1: TForm1;
    3.   LineDraw:Boolean;
    4.   PtL:Boolean;
    5. const
    6.   So=1024; // Размер оригинальной функции
    7.   Sh=1024; // размер множителя Гильберта
    8.  
    9.  
    10. implementation
    11.  
    12. uses Unit2;
    13.  
    14. {$R *.dfm}
    15.  
    16. Type
    17.   TM=Array[0..1023] of single; { TODO -onpu3pak : Create integer arrays (smallint) }
    18.   DTM=Array[0..2047] of single;
    19.  
    20. var
    21.   X,Y:TM;
    22.   Z:DTM;
    23.  
    24. {
    25. In:
    26.   X,Y - Массивы для свёртывания
    27. Out:
    28.   Z - Результирующий массив
    29. }
    30. Procedure Conv(X,Y:TM; var Z:DTM);
    31. var
    32.   i,j,Ed,Beg:Word;
    33.   sum:Extended;
    34. Begin
    35.  
    36. for i:=0 to 2*So-1 do
    37.   Begin
    38.   Sum:=0.0;
    39.  
    40.   if Sh>i then Ed:=i else Ed:=sh;
    41.   if i+1-So<=0 then Beg:=0 else Beg:= i+1-So;
    42.  
    43.   for j:=Beg to Ed do
    44.     Sum:=sum + y[j]*x[i-j];
    45.  
    46.   z[i]:= sum;
    47.   End;
    48.  
    49. end;
    50.  
    51. Procedure UPXYZ(C:Byte);
    52. const
    53.   LHHALF=30;
    54. var
    55.   i:integer;
    56.   taper:real;
    57.   temp:real;
    58. Begin
    59. Case C of
    60.   0:
    61.     Begin
    62.     temp:=0;
    63.     for i:=1 to So do
    64.       Begin
    65.       // Оригинал сигнала
    66.       //x[i-1]:=sin((i/10));
    67.       //X[i-1]:=sin(i*0.001)+4*sin(i*0.0004)+3*sin(i*0.01)+2*sin(i*0.04);
    68.       X[i-1]:=Form2.FY(i);
    69.  
    70.       // Оператор Дискретного Преобразования Гильберта (Функция для свёртки с оригиналом в результате которой получается Преобразование Гильберта)
    71.       // y=2/(Pi*х) * sin^2((pi/2)*x)
    72.       //if i mod 2 = 0 then  Y[i-1]:=0 else Y[i-1]:=2/(Pi*i);
    73.       //Y[i-1]:=cos(i*Pi);
    74.       //Y[i-1]:=Unit2.df;
    75.       //y[i-1]:=Form2.FY(i+90);
    76.       Y[i-1]:=1/(((i-So/2)-0.5)*pi);
    77.       if temp<Y[i-1] then temp:=Y[i-1];
    78.  
    79.       end;
    80.    {
    81.     // ОДПГ по одному из примеров.
    82.     y[LHHALF]:= 0.0;
    83.         for i:=1 to LHHALF do
    84.       Begin
    85.             taper := 0.54+0.46*cos(PI*i/(LHHALF));
    86.             y[LHHALF+i] := taper*(-(i mod 2)*2.0/
    87.                 (PI*(i)));
    88.             y[LHHALF-i] := -Y[LHHALF+i];
    89.       end;
    90.     }
    91.     end;
    92.   1:
    93.     Begin
    94.        for i:=1 to So do
    95.           Begin
    96.           // Оригинал сигнала
    97.           X[i-1]:=Form2.FY(i);
    98.  
    99.           // Оператор Дискретного Преобразования Гильберта (Функция для свёртки с оригиналом в результате которой получается Преобразование Гильберта)
    100.           Y[i-1]:=Unit2.df;
    101.           end;
    102.     end;
    103.   end;
    104. end;
    105.  
    106. {
    107. Функции, необзодимые для преобразования Гильберта генерируются в самой процедуре
    108. Процедура работает с глобальными массивами X,Y,Z, где Z - Выходной массив, Х - входной сигнал, У - Оператор ДПГ
    109. }
    110. Procedure TForm1.Hilb;
    111. var
    112.   i:word;
    113. Begin
    114.  
    115. { TODO -onpu3pak : Create integer arrays (smallint) }
    116. UPXYZ(0);
    117.  
    118.  
    119. // Свёртка ДПГ с Оригинальной функцией
    120. Conv(X,Y,Z);
    121. //z:=y;
    122. sleep(3);
    123. end;
    124.  
    125. procedure TForm1.IMPaint(Sender: TObject);
    126. var
    127.   i:word;
    128. //  jk:array[0..512] of single;
    129. begin
    130.  
    131. with Form1.Im do
    132.   Begin
    133.   Width:=1024;
    134.   Height:=500;
    135.   Canvas.Brush.Color:=clWhite;
    136.   Canvas.Rectangle(0,0,Width,Height);
    137.  
    138.   for i:=1 to 1023 do
    139.     Begin
    140.     if LineDraw then
    141.       Begin
    142.       // Оригинал
    143.       Canvas.Pen.Color:=clRed;
    144.       Canvas.MoveTo(i-1,300-Round(20*X[i-1]));
    145.  
    146.       Canvas.LineTo(i,300-Round(20*X[i]));
    147.       Canvas.Pen.Color:=clBlack;
    148.  
    149.       // Преобразование Гильберта
    150.       Canvas.Pen.Color:=clBlue;
    151.       Canvas.MoveTo(i-1,300-Round(20*Z[i+511]));
    152.  
    153.       Canvas.LineTo(i,300-Round(20*Z[i+512]));
    154.       Canvas.Pen.Color:=clBlack;
    155.       end
    156.     else
    157.       Begin
    158.       // Оригинал
    159.       Canvas.Pixels[i,300-Round(20*X[i])]:=clRed;
    160.  
    161.       // Преобразование Гильберта
    162.       if Ptl and ((i+512) mod 4=0) then
    163.         Canvas.Pixels[i,300-Round(12*Z[i+492])]:=clBlue;
    164.  
    165.   {    if i<512 then
    166.         Canvas.Pixels[i,300-Round(13*Z[i+512])]:=clBlue
    167.       else
    168.         Canvas.Pixels[i,280-Round(260*Z[i+480])]:=clBlue;
    169.  }
    170.       end;
    171.  
    172.     // Ось Х
    173.     Canvas.Pixels[i,300]:=clBlack;
    174.     if i mod 200 =0 then    // Риски на 200
    175.       Begin
    176.       Canvas.MoveTo(i,310);
    177.       Canvas.LineTo(i,300);
    178.       end;
    179.     if i mod 100 =0 then    // Риски на 100
    180.       Begin
    181.       Canvas.MoveTo(i,300);
    182.       Canvas.LineTo(i,295);
    183.       end;
    184.  
    185.  
    186.     // Огибающая Сигнала
    187. //    Canvas.Pixels[i,Round(20*(SQRT(Z[i+512]*Z[i+512]+X[i]*X[i])))+150]:=clGreen;
    188.     end
    189.   end;
    190. end;
    191.  
    192. // Запись в файл значений исходной функции
    193. procedure TForm1.N2Click(Sender: TObject);
    194. var
    195.   F:TFileStream;
    196.   t:SmallInt;
    197.   i:word;
    198. begin
    199.  
    200. f:=TFileStream.Create('c:\input.dat',fmCreate);
    201. for i := 0 to 1023 do
    202.   Begin
    203.  
    204.   t:=Round(X[i]*1024);
    205.   f.WriteBuffer(t,SizeOf(t));
    206.   end;
    207. f.Free;
    208.  
    209. f:=TFileStream.Create('c:\inputD.dat',fmCreate);
    210. for i := 1023 downto 0 do
    211.   Begin
    212.   t:=Round(Y[i]*1024);
    213.  
    214.   f.WriteBuffer(t,SizeOf(t));
    215.   end;
    216. f.Free;
    217.  
    218. end;
    219.  
    220. // Чтение из файла
    221. procedure TForm1.N3Click(Sender: TObject);
    222. var
    223.   f:TFileStream;
    224.   t:SmallInt;
    225.   i:word;
    226. begin
    227. LineDraw:=False;
    228. Ptl:=True;
    229. Line1.Checked:=False;
    230. f:=TFileStream.Create('c:\OutPut.dat',fmOpenRead);
    231. for i := 0 to 2047 do
    232.   Begin
    233.   f.ReadBuffer(t,SizeOf(t));
    234.   Z[i]:=t/(1024);
    235.   end;
    236. Form1.IM.Invalidate;
    237. f.Free;
    238.  
    239.  
    240. end;
    241.  
    242.  
    243.  
    244.  
    245.  
    246.  
    247.  
    248. procedure TForm1.N10Click(Sender: TObject);
    249. var
    250.   i:word;
    251. begin
    252. for i:=0 to 1023 do
    253.   Begin
    254.   Z[i-1]:=sqrt(sqr(x[i])+sqr(y[i]))*Arctan(Y[i]/X[i]);
    255.   end;
    256. Form1.IM.Invalidate;
    257. end;
    258.  
    259. procedure TForm1.N11Click(Sender: TObject);
    260. var
    261.   i:word;
    262. begin
    263. UPXYZ(1);
    264. //z:=y;
    265. form1.IM.Invalidate;
    266. end;
    267.  
    268.  
    269.  
    270.  
    271.  
    272. end.
     
  14. FatMoon

    FatMoon New Member

    Публикаций:
    0
    Регистрация:
    28 ноя 2002
    Сообщения:
    954
    Адрес:
    Russia
    Вот! С этого надо было начинать. Весь код нам (очевидно) не нужен.

    UPXYZ(0)
    Conv(X,Y,Z)
    и все.

    Причем, судя по тому, что Unit2 и форма 2 не приводятся, интересует только вариант Case 0 в UPXYZ.
    Код (Text):
    1. ...
    2. Type
    3.   TM=Array[0..1023] of single;
    4.   DTM=Array[0..2047] of single;
    5.  
    6. var
    7.   X,Y:TM;
    8.   Z:DTM;
    9. ...
    10. Procedure Conv(X,Y:TM; var Z:DTM);
    11. var
    12.   i,j,Ed,Beg:Word;
    13.   sum:Extended;
    14. Begin
    15.  
    16. for i:=0 to 2*So-1 do
    17.   Begin
    18.   Sum:=0.0;
    19.  
    20.   if Sh>i then Ed:=i else Ed:=sh;
    21.   if i+1-So<=0 then Beg:=0 else Beg:= i+1-So;
    22.  
    23.   for j:=Beg to Ed do
    24.     Sum:=sum + y[j]*x[i-j];
    25.  
    26.   z[i]:= sum;
    27.   End;
    28. end;
    29. ...
    Это уже реальнее - это можно переписать, даже не вникая, что такое происходит. Кажется, я правильно удалил комментарии и все, что не нужно? Причем, то, что в UPXYZ(0) - это вообще не относится к преобразованию, это заполнение массивов начальными данными. Самое интересное и требуемое - это свертка Z=Conv(X,Y). Где X, Y, Z - массивы 32-битных чисел в формате с плавающей точкой. Здесь только сложение и умножение, никаких синусов-косинусов. Если я не ошибся (это вопрос, требующий ответа - кому как не ТС знать, что именно из приведенного кода является преобразованием Гилберта?), то задачу сейчас какая-нибудь добрая душа напишет :))))
     
  15. alex_maslakov

    alex_maslakov New Member

    Публикаций:
    0
    Регистрация:
    15 окт 2009
    Сообщения:
    16
    Не знаю даже. Могу выложить весь код. Он работающий.
    Что из этого именно преобразование Гильберта не знаю.
    Важно то, что прога эта работает и она выводит преобразование Гильберта правильно.

    Сейчас нужно

    1) выделить из этого кода формулу преобразования Гильберта , написать в виде математической формулы без синусов, косинусов, и даже как мне подсказал препод без деления(странно).
    2) написать алгоритм исходя из нее для MMX
     
  16. Clear__Energy

    Clear__Energy New Member

    Публикаций:
    0
    Регистрация:
    30 янв 2009
    Сообщения:
    432
    Умница, задачи поставил верно ;)
    Приступай
     
  17. alex_maslakov

    alex_maslakov New Member

    Публикаций:
    0
    Регистрация:
    15 окт 2009
    Сообщения:
    16
    Твоего разрещения мне как раз не хватало.
     
  18. G13

    G13 New Member

    Публикаций:
    0
    Регистрация:
    24 мар 2006
    Сообщения:
    499
    alex_maslakov, будьте добры, перечитайте ответ #4.

    Вам никто ничем здесь не обязан. Есть желание получить знания - задавайте конкретные вопросы. Нужен готовый продукт - обращайтесь в .COMMERCE.
     
  19. alex_maslakov

    alex_maslakov New Member

    Публикаций:
    0
    Регистрация:
    15 окт 2009
    Сообщения:
    16
    Не получается перевести вышепреведенынный код с делфи на ассемблер
     
  20. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105
    С такими "вопросами" вам в Commerce... Если есть какие-то проблемы с переводом, то опишите конкретно и, судя по всему, в разделе WASM.Beginners. Но никто за вас и там не будет разбираться, что есть преобразование Гильберта. А пока ваш вопрос ничем не отличается от "поди туда, не знаю куда, принеси то, не знаю что".
    А тут вот за 250р дают :
    http://help-s.ru/works/detail.php?ID=7824
     
Статус темы:
Закрыта.