реклама на сайте
подробности

 
 
3 страниц V  < 1 2 3 >  
Reply to this topicStart new topic
> Генератор шума на AVR, Как сделать на ASM
Nanobyte
сообщение Dec 4 2006, 22:28
Сообщение #16


За битами по регистрам гоняюсь
***

Группа: Свой
Сообщений: 457
Регистрация: 24-04-06
Из: Таганрог
Пользователь №: 16 446



Цитата(Oldring @ Dec 4 2006, 23:16) *
Тогда используйте LFSR и не парьтесь. На каждый вызов подпрограммы (получение одного бита) - сдвиг на один бит и с вероятностью 1/2 XOR регистра с константой. Какой требуется минимальный период повторения последовательности?

1. А что означает "сдвиг на один бит и с вероятностью 1/2 XOR регистра "?
2. Период повторения для 16 бит будет 65535 (или 32767), что для звуковых целей вполне устроит.


--------------------
Курсор влево, курсор вправо - считается хакерством. FORMAT C: производится без предупреждения
Go to the top of the page
 
+Quote Post
Oldring
сообщение Dec 4 2006, 22:39
Сообщение #17


Гуру
******

Группа: Свой
Сообщений: 3 041
Регистрация: 10-01-05
Из: Москва
Пользователь №: 1 874



Это означает, что если значение очередного бита равно 1 - то XOR, а если 0 - то ничего больше не делать.

Интересует период повторения для одного бита. 2^16 или 2^20 ?


--------------------
Пишите в личку.
Go to the top of the page
 
+Quote Post
Nanobyte
сообщение Dec 4 2006, 22:48
Сообщение #18


За битами по регистрам гоняюсь
***

Группа: Свой
Сообщений: 457
Регистрация: 24-04-06
Из: Таганрог
Пользователь №: 16 446



Цитата(Oldring @ Dec 4 2006, 23:39) *
Интересует период повторения для одного бита. 2^16 или 2^20 ?

Прошу прощения, не понял. Что такое "период повторения для одного бита"? Требуемый период повторения побитно выводимого числа - 16 битов.


--------------------
Курсор влево, курсор вправо - считается хакерством. FORMAT C: производится без предупреждения
Go to the top of the page
 
+Quote Post
Oldring
сообщение Dec 4 2006, 22:58
Сообщение #19


Гуру
******

Группа: Свой
Сообщений: 3 041
Регистрация: 10-01-05
Из: Москва
Пользователь №: 1 874



Цитата
ldi r19, #87h
lsl r16
sbrc r18, 7
eor r16, r19
rol r17
rol r18


Очередной бит - в С. Или в r16.0, если больше нравится. Период повторения должен быть 2^24 - 1. Между вызовами нужно сохранять r16, r17, r18. Любой из этих регистров нужно проинициализировать чем-нибудь ненулевым.

Цитата(Nanobyte @ Dec 4 2006, 22:48) *
Прошу прощения, не понял. Что такое "период повторения для одного бита"? Требуемый период повторения побитно выводимого числа - 16 битов.


Это означает, что в любом случае Вы выводите не последовательность чисел, а последовательность битов. Так как она псевдослучайная - у нее есть период повторения.
Как генератор 16-битных псевдослучайных чисел этот генератор неидеален, но на слух вряд-ли кто-то что-то заметит.


--------------------
Пишите в личку.
Go to the top of the page
 
+Quote Post
Nanobyte
сообщение Dec 4 2006, 23:07
Сообщение #20


За битами по регистрам гоняюсь
***

Группа: Свой
Сообщений: 457
Регистрация: 24-04-06
Из: Таганрог
Пользователь №: 16 446



Цитата(Oldring @ Dec 4 2006, 23:58) *
Как генератор 16-битных псевдослучайных чисел этот генератор неидеален, но на слух вряд-ли кто-то что-то заметит.

Совершенно верно. Спасибо за пример реализации. Буду пробовать.


--------------------
Курсор влево, курсор вправо - считается хакерством. FORMAT C: производится без предупреждения
Go to the top of the page
 
+Quote Post
antoker
сообщение Dec 5 2006, 00:42
Сообщение #21


Участник
*

Группа: Новичок
Сообщений: 15
Регистрация: 27-11-06
Из: Tromsoe, Norway
Пользователь №: 22 821



Цитата(Oldring @ Dec 4 2006, 22:16) *
И разрядность числа возрастает бесконечно biggrin.gif
В любом случае, это наверняка очень плохой генератор псевдослучайных чисел, раз Кнут о нем не упоминает laugh.gif


это каким это образом разрядность будет возрастать бесконечно, в AVR бесконечные регистры по длине? cool.gif естественно подразумевалось периодическое обнуление seed'a. Да и придираться особо не надо, этот метод был предложен в 1946 году и в плане обучения, так для расширения кругозора очень даже подходит wink.gif
Go to the top of the page
 
+Quote Post
singlskv
сообщение Dec 5 2006, 02:12
Сообщение #22


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Цитата(Nanobyte @ Dec 4 2006, 22:28) *
2. Период повторения для 16 бит будет 65535 (или 32767), что для звуковых целей вполне устроит.

Нет, не будет (65536 или 32768)
У IAR при старте генератора псевдослучайных чисел с 1 зацикливание происходит примерно
после 2000 значений, при старте с 2 чуть побольше, но тоже не так уж и много.

Если у Вас есть реализация CRC16 на asm, то попробуйте просто подсовывать ей значения в
цикле например так:
1,2,3,4,.....
ну или так:
1,2,3,5,8,13,21,.....
ну или так:
выберите максимальное простое число xxxxx в диапазоне 0-65535
с него и начните подсовывать
xxxxx, 2*xxxxx/65536, 3*xxxxx/65536, ....

Типа, вариантов куча.
Просто нужно протестировать какой длинны последовательность Вы будете полчать
до зацикливания.
Удачи.
Go to the top of the page
 
+Quote Post
Nanobyte
сообщение Dec 5 2006, 02:28
Сообщение #23


За битами по регистрам гоняюсь
***

Группа: Свой
Сообщений: 457
Регистрация: 24-04-06
Из: Таганрог
Пользователь №: 16 446



Цитата(singlskv @ Dec 5 2006, 03:12) *
Нет, не будет (65536 или 32768)
У IAR при старте генератора псевдослучайных чисел с 1 зацикливание происходит примерно
после 2000 значений, при старте с 2 чуть побольше, но тоже не так уж и много.

Ну почему-же не будет? Кусочек кода, приведённый Oldring, я только что попробовал. Работает вроде-бы нормально (детально не проверял). Самое главное, уяснил принцип, теперь подберу коэффициенты для получения последовательности максимальной длины. Хотя, на слух, меня вполне устраивает шум, сгенерированный приведённым в примере кодом.
Ну, а что касается IAR, то его функции и библиотеки могут быть просто недоработаны, или написаны студентами в качестве курсовой работы (IMHO, конечно). Сталкивался с такими примерами для компонентов Delphi. Отбил весь лоб на поле с граблями, плюнул и написал необходимое сам.


--------------------
Курсор влево, курсор вправо - считается хакерством. FORMAT C: производится без предупреждения
Go to the top of the page
 
+Quote Post
singlskv
сообщение Dec 5 2006, 02:55
Сообщение #24


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Цитата(Nanobyte @ Dec 5 2006, 02:28) *
Цитата(singlskv @ Dec 5 2006, 03:12) *
Нет, не будет (65536 или 32768)
У IAR при старте генератора псевдослучайных чисел с 1 зацикливание происходит примерно
после 2000 значений, при старте с 2 чуть побольше, но тоже не так уж и много.

Ну почему-же не будет? Кусочек кода, приведённый Oldring, я только что попробовал. Работает вроде-бы нормально (детально не проверял). Самое главное, уяснил принцип, теперь подберу коэффициенты для получения последовательности максимальной длины. Хотя, на слух, меня вполне устраивает шум, сгенерированный приведённым в примере кодом.
Ну, а что касается IAR, то его функции и библиотеки могут быть просто недоработаны, или написаны студентами в качестве курсовой работы (IMHO, конечно). Сталкивался с такими примерами для компонентов Delphi. Отбил весь лоб на поле с граблями, плюнул и написал необходимое сам.

Попробуйте выяснить какая у Вас получится длинна последовательности 16битнных значений.
ИМХО, в IAR должно получаться не меньше.
А то, что на слух Вас устраивает, так это всего лишь ознаает что Вы изначально завышали свои
требования к случайности сигнала.
Тот код который Вам привел Oldring, это ИМХО, некоторые вариации на темму CRC8 smile.gif
Go to the top of the page
 
+Quote Post
add
сообщение Dec 5 2006, 09:39
Сообщение #25


Местный
***

Группа: Свой
Сообщений: 345
Регистрация: 10-10-05
Пользователь №: 9 459



Прикрепленный файл  RND.zip ( 8.04 килобайт ) Кол-во скачиваний: 158
Странно что поиск ничего не дал?!
http://electronix.ru/forum/index.php?showtopic=22174&hl=

Вот непомню где нашел, прикладываю (asm) (правда псевдо RND- по понятным причинам), но переделывал под свою прогу... все ок. Была необходимость чтобы в начале работы нескольких контроллеров было RND значение, вот с этим парился..и ничего лучшего чем прописать в несколько контроллеров разные константы не нашел.
зы:внешние элементы не катят..разбежка внутренних генераторов тоже. код он и есть код
зы2:

clr r16
clr r17
sbrc r3,6 ;39
sbr r16,1<<0 ;XXXXXXXA
sbrs r3,2 ;35
sbr r17,1<<0 ;XXXXXXXB
eor r17,r16 ;Xor
ror r17 ;Put bit 0 in carry
;Bits Hill's bits
rol r1 ;7-0 8-1
rol r2 ;15-8 16-9
rol r3 ;23-16 and so on
rol r4 ;31-17

зы: можно сделать любую разрядность псевдо rnd.


--------------------
Если задачу можно решить, то не надо тревожиться. А если нельзя решить, то тревожиться бесполезно.
Go to the top of the page
 
+Quote Post
Oldring
сообщение Dec 5 2006, 10:00
Сообщение #26


Гуру
******

Группа: Свой
Сообщений: 3 041
Регистрация: 10-01-05
Из: Москва
Пользователь №: 1 874



Цитата(Nanobyte @ Dec 5 2006, 02:28) *
Ну почему-же не будет? Кусочек кода, приведённый Oldring, я только что попробовал. Работает вроде-бы нормально (детально не проверял). Самое главное, уяснил принцип, теперь подберу коэффициенты для получения последовательности максимальной длины. Хотя, на слух, меня вполне устраивает шум, сгенерированный приведённым в примере кодом.


Если я не ошибся с переводом восьмеричных чисел в шестнадцатеричные wink.gif использованный мною полином дает последовательность максимальной длины 2^24-1. Можете это протестировать экспериментально.

Цитата(singlskv @ Dec 5 2006, 02:12) *
У IAR при старте генератора псевдослучайных чисел с 1 зацикливание происходит примерно
после 2000 значений, при старте с 2 чуть побольше, но тоже не так уж и много.


Смешно.

Настолько стало любопытно что даже посмотрел что IAR генерирует, хоть я и не брался за AVR уже давно. IAR3.2. Применен 32-битный линейный конгруэнтный генератор, при этом берутся старшие 16 бит. Реализация использует библиотечную функция умножения 32-битных беззнаковых чисел. То есть, медленно но стандартно. Скорее всего, Вас ввело в заблуждение то, что для такого генератора повторение 16-битного числа не означает повторение последовательности. Период повторения последовательности должен быть равен 2^32 чисел.


--------------------
Пишите в личку.
Go to the top of the page
 
+Quote Post
_Bill
сообщение Dec 5 2006, 10:27
Сообщение #27


Местный
***

Группа: Участник
Сообщений: 416
Регистрация: 18-04-06
Из: Челябинск
Пользователь №: 16 219



Цитата(Nanobyte @ Dec 4 2006, 20:14) *
Здравствуйте, коллеги.
Необходимо генерировать шумовой сигнал на одном из выводов МК. Как я понимаю, используя генератор псевдослучайных чисел, можно получить требуемый результат. Разрядность числа вполне устроит 16 бит. Поиск по форуму даёт реализации только на Си.
Вопрос: как это сделать, используя ассемблер? Может, кто нибудь из Вас уже делал такой ГПСЧ ?
Спасибо.

Я сделал генератор ПСЧ на 31 бит так:
Код
    name    Rand
;
;
;    File:    rand.s90
;
;    08-Sep-05 BK    Initial edit
;    28-Sep-05 BK    Last  update
;
$fmacros.inc

    rseg    CODE    ; Code segment
;
;
    ENTRY$    Rand
    ldi    r30, LOW(_rand)     ; Point at random number
    ldi    r31, HIGH(_rand)    ;
    tst    r16            ; See the seed value
    breq    _1              ; Branch if zero

    clr    r17            ; Initialize the generator
    clr    r18            ; and return initial value
    clr    r19            ;
    rjmp    _2                 ;

_1:    ; Calculate new random number
    ld    r16, Z        ; Load the previous value into registers
    ldd    r17, Z+1        ;
    ldd    r18, Z+2        ;
    ldd    r19, Z+3        ;
    eor    r16, r19         ; Calculate feedback bit
    bst    r16, 6                 ;
    eor    r16, r19            ;
    lsl    r16             ; Shift the number left
    rol    r17            ;
    rol    r18            ;
    rol    r19            ;
    andi    r19, ~(1<<7)     ; Clear high (sign) bit
    bld    r16, 0        ; Insert feedback bit in the new value
_2:    st    Z,   r16          ; Save the number
    std    Z+1, r17        ;
    std    Z+2, r18        ;
    std    Z+3, r19        ;
    ret

    rseg    NEAR_Z    ; Data segment
    
_rand:        ; Random number
    ds    4    ;

    end
Go to the top of the page
 
+Quote Post
Oldring
сообщение Dec 5 2006, 11:01
Сообщение #28


Гуру
******

Группа: Свой
Сообщений: 3 041
Регистрация: 10-01-05
Из: Москва
Пользователь №: 1 874



Цитата(_Bill @ Dec 5 2006, 10:27) *
Я сделал генератор ПСЧ на 31 бит так:
Код
    eor    r16, r19        ; Calculate feedback bit
    bst    r16, 6                ;
    eor    r16, r19        ;


Хотите сказать, что полином 0x80000041 примитивный?
Кроме того, Вы используете из результата на каждой итерации 1 бит или 31?


--------------------
Пишите в личку.
Go to the top of the page
 
+Quote Post
Oldring
сообщение Dec 5 2006, 11:16
Сообщение #29


Гуру
******

Группа: Свой
Сообщений: 3 041
Регистрация: 10-01-05
Из: Москва
Пользователь №: 1 874



Цитата(singlskv @ Dec 5 2006, 02:55) *
А то, что на слух Вас устраивает, так это всего лишь ознаает что Вы изначально завышали свои
требования к случайности сигнала.
Тот код который Вам привел Oldring, это ИМХО, некоторые вариации на темму CRC8 smile.gif


Может быть Вы даже сможете самостоятельно придумать тест, который покажет неслучайность генерируемых 16-битных чисел? Только пожалуйста получайте 16-битное число побитово.

Вообще-то такой тест существует, и он довольно простой - но не думаю, что кто-либо способен выполнить его на слух biggrin.gif


--------------------
Пишите в личку.
Go to the top of the page
 
+Quote Post
_Bill
сообщение Dec 5 2006, 11:35
Сообщение #30


Местный
***

Группа: Участник
Сообщений: 416
Регистрация: 18-04-06
Из: Челябинск
Пользователь №: 16 219



Цитата(Oldring @ Dec 5 2006, 11:01) *
Цитата(_Bill @ Dec 5 2006, 10:27) *

Я сделал генератор ПСЧ на 31 бит так:
Код
    eor    r16, r19    ; Calculate feedback bit
    bst    r16, 6            ;
    eor    r16, r19    ;


Хотите сказать, что полином 0x80000041 примитивный?
Кроме того, Вы используете из результата на каждой итерации 1 бит или 31?

Вообще-то, на каждой итерации я использую все 31 бит. Что касается полинома, то я взял номера отводов из таблицы, приведенной в статье "Генеатор белого шума на сдвигающем регистре с обратной связью" (Электроника, №11, 1976). Там имеется ссылка на: S.Golomb "Shift Register Sequences", 1967.
Для 31-разрядного регистра имеется несколько вариантов включения: x30 + x2, x30 + x5, x30 + x6, x30 + x12. Я выбрал варианте x30 + x6, поскольку не требуется дополнительных сдвигов для выравнивания разрядов.
Go to the top of the page
 
+Quote Post

3 страниц V  < 1 2 3 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 15th July 2025 - 16:37
Рейтинг@Mail.ru


Страница сгенерированна за 0.01521 секунд с 7
ELECTRONIX ©2004-2016