Администрация форума не несёт ответственности за достоверность информации и оставляет за собой право редактировать или в особых случаях даже удалять посты без предупреждения. Спасибо за понимание.

Программирование ATMEL в BASCOM.

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » Помогите с алгоритмом!


Помогите с алгоритмом!

Сообщений 1 страница 23 из 23

1

В цикле статей Рюмика в Радиоаматоре была светомузыка, там скорость  переключения светодиодиодов зависимости от громкости музыки, а я хочу чтобы было три канала - НЧ, СЧ и ВЧ, т.е. частотное разделение с выходом на светодиоды.
ПРИМЕРНЫЙ АЛГОРИТМ РАБОТЫ:

Светодиоды     -     1 2 3 4 5 6 7 8 9 10 11 12

НЧ уровень 0         *
НЧ уровень 1         * *
НЧ уровень 2         * * *
НЧ уровень 3         * * * *
СЧ уровень 0                    *
СЧ уровень 1                    * *
СЧ уровень 2                    * * *
СЧ уровень 3                    * * * *
ВЧ уровень 0                               *
ВЧ уровень 1                               * *
ВЧ уровень 2                               * * *
ВЧ уровень 3                               * * * *

Если надо, схему нарисую.

0

2

Схемку надо, давай, а вот с такой индикацией нужно делать скорее всего АЦП.

0

3

Это понятно, что нужно делать АЦП.
Есть два варианта:
1. Сделать частотные фильтры НЧ, СЧ и ВЧ на операционниках (транзисторах), подать три разделённых сигнала на три входа АЦП, проанализировать уровни и в зависимости от них включать выходы контроллера. Схемотехнически сложнее, программно легче.
2. Подавать аудио сигнал на один вход АЦП, а разделение по частоте сделать программно, сам пытаюсь работать над подобной проблемой. Схемотехнически просто, а с программой...

0

4

radan, мне 1 вариант больше понравился.
помоему он технически проще.

0

5

http://arvresearch.nm.ru/any-sch/licht-m.dhtml
Микро-цветомузыка на AT89C1051/C2051/C4051/S2051/S4051
исходник программы на ассемблере, но за основу можно взять и переделать на бейсик.

0

6

http://instruct1.cit.cornell.edu/course … /index.htm
Цветомузыкальный фонтан, Фурье и ШИМ присутствуют в исходниках, 8 каналов. Правда на СИ, но есть над чем поработать.

0

7

http://www.elektroda.pl/rtvforum/download.php?id=161424
Спектроанализатор на 8535 схема, исходники на Баском.

http://www.elektroda.pl/rtvforum/viewto … 35d3227228
http://www.elektroda.pl/rtvforum/topic14925-0.html
Можно посмотреть здесь о Фурье и AVR.

0

8

У меня где то была книжка с бейсиком.Там были примерчики спектрального анализа, и быстрого преобразования фурье. Но я думаю, даже уверен, что авр будет "слегонца" призадумываться. Так что первый вариант конечно же практичнее.Помудрить с фильтрами на операционниках да и делов.
Но если надо, в принципе исходники могу кинуть, только на васком надо будет эт перекувыркать.

0

9

Кидайте, нужно.

0

10

http://airylight.nm.ru/index.dhtml

0

11

http://alglib.sources.ru/fft/

http://ru.wikipedia.org/wiki/Быстрое_пр … ание_Фурье

Страница на википедии про фурье с примерами на С++ и паскале

вот процедура на паскале

Код:
procedure FFT(var a : TSingleArray;
     nn : Integer;
     InverseFFT : Boolean);
var
    ii, jj, n, mmax, m, j, istep, i, isign : Integer;
    wtemp, wr, wpr, wpi, wi, theta, tempr, tempi : Double;
begin
    if InverseFFT then isign := -1
    else isign := 1;
    n := 2*nn; j := 1; ii:=1;
    while ii <= nn do
    begin
        i := 2*ii-1;
        if j>i then
        begin
            tempr := a[j-1];
            tempi := a[j];
            a[j-1] := a[i-1];
            a[j] := a[i];
            a[i-1] := tempr;
            a[i] := tempi;
        end;
        m := n div 2;
        while (m>=2) and (j>m) do
        begin
            j := j-m;
            m := m div 2;
        end;
        j := j+m;
        Inc(ii);
    end;
    mmax := 2;
    while n>mmax do
    begin
        istep := 2*mmax;
        theta := 2*Pi/(isign*mmax);
        wpr := -2.0*sqr(sin(0.5*theta));
        wpi := sin(theta);
        wr := 1.0;
        wi := 0.0;
        ii:=1;
        while ii<=mmax div 2 do
        begin
            m := 2*ii-1;
            jj:=0;
            while jj<=(n-m) div istep do
            begin
                i := m+jj*istep;
                j := i+mmax;
                tempr := wr*a[j-1]-wi*a[j];
                tempi := wr*a[j]+wi*a[j-1];
                a[j-1] := a[i-1]-tempr;
                a[j] := a[i]-tempi;
                a[i-1] := a[i-1]+tempr;
                a[i] := a[i]+tempi;
                Inc(jj);
            end;
            wtemp := wr;
            wr := wr*wpr-wi*wpi+wr;
            wi := wi*wpr+wtemp*wpi+wi;
            Inc(ii);
        end;
        mmax := istep;
    end;
    if InverseFFT then
    begin
        I:=1;
        while I<=2*nn do
        begin
            a[I-1] := a[I-1]/nn;
            Inc(I);
        end;
    end;
end;

Отредактировано Pasha (2009-06-24 12:48:34)

0

12

Вот сежу и думаю как сделать...  Тоже нужно )))  А если попробовать через ацп включать таймер в начале периода и выключать его в конце периода. как раз и амплитуду посмотреть и частоту...  потом выполнить условия и выполнения подпрограмм....  включать ацп для замера с большой частотой...))) Не знаю, получится или нет )))

вроде с активными фильтрами и 3-мя входами ацп - и понятно и проще... 

P.S. Помница фильм "Умница Уилл Хантинг" как профессор математики 2 года ряд фурье доказывал...  Не хочется пол года потратить на эти формулы,, как один коллега потратил на это )))

0

13

vanno44 написал(а):

Вот сежу и думаю как сделать...  Тоже нужно )))  А если попробовать через ацп включать таймер в начале периода и выключать его в конце периода. как раз и амплитуду посмотреть и частоту...  потом выполнить условия и выполнения подпрограмм....  включать ацп для замера с большой частотой...))) Не знаю, получится или нет )))

вроде с активными фильтрами и 3-мя входами ацп - и понятно и проще... 

P.S. Помница фильм "Умница Уилл Хантинг" как профессор математики 2 года ряд фурье доказывал...  Не хочется пол года потратить на эти формулы,, как один коллега потратил на это )))


Всё придумано до нас(или за нас)... Исходники присутствуют. Получится что-то - присылайте, выложу на сайте.
http://bascom.at.ua/publ/cvetomuzyka_qu … t/1-1-0-20
http://bascom.at.ua/publ/rgb_cmu/1-1-0-76

0

14

Как правильно записать такое условие ?
If (Menu >= 21 And Menu <= 29 Or Menu >= 210 And Menu <= 290) Or Menu = 0 Then

0

15

В 2 If обверните.

0

16

If If (Menu >= 21 And Menu <= 29 Or Menu >= 210 And Menu <= 290) Or Menu = 0 Then - так ?

0

17

У вас же все сравнения через "или"...
Разделите на три строки и не мучайтесь...

If Menu = 0 Then ...
If Menu >= 21 And Menu <= 29 Then ...
If Menu >= 210 And Menu <= 290 Then ...

Если результаты сравнений должны привести в одну точку, тогда для всех: If ... Then <метка перехода>

0

18

Мне нужно чтоб любое сравнение из трёх приводило в одну точку.

Отредактировано olegkaras (2017-11-17 22:54:29)

0

19

olegkaras написал(а):

Мне нужно чтоб любое сравнение из трёх приводило в одну точку.

Ну а я об чем ? ;)

   Начинаем "сравнения":
If Menu = 0 Then <одна точка>
   Если не "прокатывает, то:
If Menu >= 21 And Menu <= 29 Then <одна точка>
   Если и тут не прокатило, то:
If Menu >= 210 And Menu <= 290 Then <одна точка>

Только лучше установить более четкие границы для сравнения, так точнее обрабатывается.
If Menu = 0 Then <одна точка>
If Menu > 20 And Menu < 30 Then <одна точка>
If Menu > 209 And Menu < 291 Then <одна точка>

Отредактировано Nord (2017-11-17 23:05:03)

0

20

Да тут святотатство в Bascom храме  :D
Напомнило мне созданное устройство переключение коробки по аналоговому сигналу.

Код:

Algebra1=АЦП-порог 'меньше нуля нельзя
Algebra2=АЦП+порог 'только ограничить надо до 1023

      Ac0 = 48 'среднее значение
      If Ac0 >= Algebra1 And Ac0 <= Algebra2 Then
         <одна точка>
      End If

      Ac0 = 96
      If Ac0 => Algebra1 And Ac0 <= Algebra2 Then
          <одна точка>
      End If

      Ac0 = 147
      If Ac0 => Algebra1 And Ac0 <= Algebra2 Then
'         <одна точка>
      End If

      Ac0 = 199
      If Ac0 => Algebra1 And Ac0 <= Algebra2 Then
'         <одна точка>
      End If

      Ac0 = 253
      If Ac0 => Algebra1 And Ac0 <= Algebra2 Then
'       ...
      End If

     ....
      

0

21

Понял. Попробую таким образом реализовать алгоритм.

0

22

olegkaras написал(а):

Понял. Попробую таким образом реализовать алгоритм.

Ну и ?...
Попкорн заканчивается... ;)

0

23

Nord
а нечего лопать после 6 вечера  :glasses:
и ваще - может у человека шаббат, а вы его грешить хотите заставить

0


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » Помогите с алгоритмом!