Comments (7)
Я тут провел расчеты на бумаге, оказывается все может быть еще проще. В принципе с такой системой мы не сможем мерять частоту, нам даже не надо считать тики, это бесполезно, т.к. наш дискрет времени - 21мкс, но мы может отличить 21 кГц на фоне 15 или даже 18 за счет дискретности, см. файлы:
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.
Анализ перехода 21 кГц в 18 кГц (как самого трудного):
from 2dimageprocessing.
Поскольку мы имеем дело с тривиальной световой пульсацией "перепрыгивающей" с одной частоты на другую спектральный анализ посредством Фурье кажется нецелесообразным по следующим причинам:
-
Отсутствие данных для проведения анализа. В виду отсутствия корреляции между пульсациями на разных частотах не представляется возможным воспринимать их в виде единого сигнала. Безусловно, обладая всеми необходимыми характеристиками пульсации мы могли бы реставрировать(выровнять интервалы между вспышками и сами вспышки по продолжительности, устранить коллизии) и реконструировать(синтезировать) единый сигнал во временной области, затем преобразовать его к представлению в частотной области(получить спектр) и анализировать. Однако, учитывая тот факт, что наличие, либо отсутствие посторонней пульсации становится очевидно просто сравнив продолжительность интервалов и/или вспышек, все вышеперечисленные манипуляции теряют какой-либо практический смысл.
-
Отсутствие возможности хранения семплов на ПЛИС. У нас не хватит ресурсов.
-
Передача семплов процессору(если бы мы решили пойти таким путем) породит латентность которая не позволит нам закончить обработку за отведенное время.
from 2dimageprocessing.
АЛГОРИТМ №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 варианта:
- Переход в новую частоту на противоположной фазе, например, 0 частоы 0 в 1 частоты 1
- Переход на новую частоту в той же фазе длинная 1 (длинного 0, по-моему, не существует).
При этом аккумулируя периоды одной частоты мы проводим вычисления среднего числа тиков периода данной частоты и это среднее значение используем (если оно вычислено) для сравнения с числом тиков полупериода или периода другой частоты, среднее значение нам теоретически может дать уменьшение числа импульсов и передвижение в область близкую к центру погрешности т.е. к readout/2 (но это еще необходимо посчитать). Но в условиях таких погрешностей, для диска курса все может быть неплохо, а для тангажа могут быть проблемы (большое перекрытие).
from 2dimageprocessing.
`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.
Алгоритм замеряет время прошедшее с момента регистрации последнего импульса и сравнивает его с периодами заданных частот + допуск. В случае прыжка или ошибки просто еще раз считаем время начиная с проблемного импульса до следующего за ним. Как только частота стабилизируется, она фиксируется и сопоставляется с той что была зарегистрирована ранее.
- Определяем текущую частоту (полагаю, опорную).
- Проверяем каждый промежуток между импульсами и ждем прыжок.
- Пытаемся фиксировать прыжок.
- В случае неудачи замеряем следующий интервал, определяем текущую частоту и фиксируем прыжок.
from 2dimageprocessing.
Проект заморожен, задача прекращается в связи со сворачиванием 218-го.
from 2dimageprocessing.
Related Issues (17)
- Блок дизайн схемы обработки изображений HOT 1
- Чтение конфигурации с драгстеров HOT 4
- Проверка частотного детектора HOT 13
- Синхронный резет HOT 1
- Добавить новую команду в image_capture_manager
- Режим калибровки для определения оптимального значения порога HOT 6
- Сбор значений множества пикселей для усреднения HOT 1
- Полноценная реализация анализатора частот HOT 1
- Тест на frequency_analyzer_synch HOT 1
- Чтение данных-результатов определения времен действия частот по AXI HOT 2
- HDL wrapper (HDL обертка) HOT 1
- Time constraints (Временные ограничения) HOT 1
- Написать тестбенчи на все модули HOT 1
- Параметры анализатора частот HOT 3
- Точность анализатора частот HOT 10
- Альфа версия в дебаг режиме HOT 1
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
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.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from 2dimageprocessing.