Giter Site home page Giter Site logo

Comments (7)

EvilLord666 avatar EvilLord666 commented on May 24, 2024 2

Я тут провел расчеты на бумаге, оказывается все может быть еще проще. В принципе с такой системой мы не сможем мерять частоту, нам даже не надо считать тики, это бесполезно, т.к. наш дискрет времени - 21мкс, но мы может отличить 21 кГц на фоне 15 или даже 18 за счет дискретности, см. файлы:
p_20170816_010604
p_20170816_010616
p_20170816_010622

9 кГц -> 5-6 ридаутов на период
13 кГц -> 4-5 ридаутов
15 и 18 - 3-4 ридаута
21 - 2 ридаута
(см. картинки)
Причем точность выше при расчете на период нежели чем на половину периода (вот в чем одна из проблем сейчас). Нам нужно считать число ридаутов за период (т.е. двойное изменение уровня по сравнению с порогом). Случай когда точка из пары 15,21 или 21,18 нужно взять периода 4 и сравнить длительности, если число ридаутов == 2 то мы нашли 21 кГц (их конечно может и 3 , но тогда надо брать соседний, потому что если смотреть рисунок, то после 3х ридаутов для 21кГц сразу идет 2).

from 2dimageprocessing.

EvilLord666 avatar EvilLord666 commented on May 24, 2024 1

Анализ перехода 21 кГц в 18 кГц (как самого трудного):
p_20170820_231413

from 2dimageprocessing.

VeryNiceGuy avatar VeryNiceGuy commented on May 24, 2024

Поскольку мы имеем дело с тривиальной световой пульсацией "перепрыгивающей" с одной частоты на другую спектральный анализ посредством Фурье кажется нецелесообразным по следующим причинам:

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

  2. Отсутствие возможности хранения семплов на ПЛИС. У нас не хватит ресурсов.

  3. Передача семплов процессору(если бы мы решили пойти таким путем) породит латентность которая не позволит нам закончить обработку за отведенное время.

from 2dimageprocessing.

EvilLord666 avatar EvilLord666 commented on May 24, 2024

АЛГОРИТМ №1 (Рабоче-крестьянский)
Во многих статьях пишут, что чем меньше сложных дейтсвий в алгоритме, тем лучше, поэтому самый, наверное, простой алгоритм.

На Dragster у нас имеется по 6 точек, поэтому при проходе линейки получаем следущее (псевдокод)

for(для каждой точки) // 0..5
{
if(первый запуск) // самое начало 500мкс цикла
фаза = нач._фаза
else
{
while(!прыжок_частоты)
{
for(half_period = 0; half_period <=1; half_period++)
{
while(текущая_фаза == фаза || interrupt); //ждем или ожидание прерывается
// произошел скачок фиксируем полупериод
число_тиков_периода += счетчик; // просуммировали полупериод
текущая_фаза = фаза
if(!check_half_period(счетчик)) // проверяем число тиков полупериода на
// грубое соответсвие и устанавливаем special_case
// когда у нас перекрытие единиц или нулей
{
прыжок_частоты = true;
break;
}
if(special_case)
{
прыжок_частоты = true;
}
if(half_period == 1)
{
число_тиков += число_тиков_периода;
счетчик_периодов++
check_period(число_тиков)
}
}
if(число периодов in (2,4,8)
{
среднее_число_тиков_за_период = число_тиков / число периодов;
// усреднение нужно для возможного уменьшения среднего
// зафиксированного числа тиков для уменьшения площади перекрытия
// числа тиков +- ридаут для двух разных частот, но чтобы оценить как это
// дейтсивтельно работает нужно посчитать (см. первый пост)

           }
      }
  }
 if(прыжок_частоты)
 {
      индекс_ожидаемой_чатоты ++;    // но проверку также необходимо сделать, 
                                                              // это значение не может быть больше 1
     // все теперь можем дальше ничего не считать, т.к. общее число тиков нам известно
 }

}

Т.е. вся идея паттерна это поиск прыжка частоты, может быть 2 варианта:

  1. Переход в новую частоту на противоположной фазе, например, 0 частоы 0 в 1 частоты 1
  2. Переход на новую частоту в той же фазе длинная 1 (длинного 0, по-моему, не существует).

При этом аккумулируя периоды одной частоты мы проводим вычисления среднего числа тиков периода данной частоты и это среднее значение используем (если оно вычислено) для сравнения с числом тиков полупериода или периода другой частоты, среднее значение нам теоретически может дать уменьшение числа импульсов и передвижение в область близкую к центру погрешности т.е. к readout/2 (но это еще необходимо посчитать). Но в условиях таких погрешностей, для диска курса все может быть неплохо, а для тангажа могут быть проблемы (большое перекрытие).

from 2dimageprocessing.

VeryNiceGuy avatar VeryNiceGuy commented on May 24, 2024
`timescale 1 ns / 1 ps

module frequency_jump_detector #
(
    parameter pixel_number = 0,
    parameter period_1, /* нс */
    parameter period_2, /* нс */
    parameter period_3, /* нс */
    parameter tolerance /* нс */
)
(
    input wire pixel_clock,
    input wire reset,
    input wire enable,
    output wire jump_detected,
    input wire lval,
    input wire[7:0] pixel
);

localparam period_50MHz = 20;
reg[11:0] pixel_counter;
reg measure_time;
reg[31:0] elapsed_time;

reg[1:0] current_frequency;
localparam FREQUENCY_UNKNOWN = 2'b00;
localparam FREQUENCY_1 = 2'b01;
localparam FREQUENCY_2 = 2'b10;
localparam FREQUENCY_3 = 2'b11;

always@(posedge pixel_clock) begin
    if(!reset) begin
        pixel_counter <= 0;
        measure_time <= 1'b0;
        elapsed_time <= 0;
        current_frequency <= FREQUENCY_UNKNOWN;
    end

    else begin
        if(enable) begin
            if(lval) begin
                pixel_counter <= pixel_counter + 1;
            
                if(measure_time)
                    elapsed_time <= elapsed_time + period_50MHz;
            
                if(pixel_counter == pixel_number) begin
                    if(pixel != 0) begin
                        if(!measure_time) begin
                            measure_time <= 1'b1;
                            elapsed_time <= elapsed_time + period_50MHz;
                        end
                    
                        else begin
                            /* Сбрасываем время. */
                            elapsed_time <= 0;
					
			/* Время между импульсами приблизительно соответствует периоду частоты 1. */
                            if(elapsed_time >= period_1 - tolerance && elapsed_time <= period_1 + tolerance) begin
                                if(current_frequency != FREQUENCY_UNKNOWN && current_frequency != FREQUENCY_1)
                                    jump_detected <= 1'b1;
                                
                                current_frequency <= FREQUENCY_1;
                            end
                        
                        /* Время между импульсами приблизительно соответствует периоду частоты 2. */
                        else if(elapsed_time >= period_2 - tolerance && elapsed_time <= period_2 + tolerance) begin
                            if(current_frequency != FREQUENCY_UNKNOWN && current_frequency != FREQUENCY_2)
                                jump_detected <= 1'b1;

                            current_frequency <= FREQUENCY_2;                               
                        end
                        
                        /* Время между импульсами приблизительно соответствует периоду частоты 3. */
                        else if(elapsed_time >= period_3 - tolerance && elapsed_time <= period_3 + tolerance) begin
                            if(current_frequency != FREQUENCY_UNKNOWN && current_frequency != FREQUENCY_3)
                                jump_detected <= 1'b1;
                        
                            current_frequency <= FREQUENCY_3;
                        end
                        
                        /* Промежуток оказался слишком коротким, либо длинным. */
                        /* else begin
                                jump_detected <= 1'b1;
                                current_frequency <= FREQUENCY_UNKNOWN;
                            end
                        */
                        end
                    end
                end
            
                else begin
                    jump_detected <= 1'b0;
                end
            end
        
            else begin
                pixel_counter <= 0;
            end
        end
    end
end

endmodule

from 2dimageprocessing.

VeryNiceGuy avatar VeryNiceGuy commented on May 24, 2024

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

  1. Определяем текущую частоту (полагаю, опорную).
  2. Проверяем каждый промежуток между импульсами и ждем прыжок.
  3. Пытаемся фиксировать прыжок.
  4. В случае неудачи замеряем следующий интервал, определяем текущую частоту и фиксируем прыжок.

from 2dimageprocessing.

EvilLord666 avatar EvilLord666 commented on May 24, 2024

Проект заморожен, задача прекращается в связи со сворачиванием 218-го.

from 2dimageprocessing.

Related Issues (17)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.