С Новым годом! Форум программистов, компьютерный форум, киберфорум
Arduino
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/4: Рейтинг темы: голосов - 4, средняя оценка - 5.00
1 / 1 / 0
Регистрация: 01.11.2022
Сообщений: 78
1

Хочу сделать анализатор спектра на Arduino с помощью преобразования Хартли

29.04.2024, 17:56. Показов 692. Ответов 5

Author24 — интернет-сервис помощи студентам
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
#include <Adafruit_NeoPixel.h>
//#include "NeoPixelPrint.h"
#include <math.h>
 
const int SAMPLES = 16;  // Количество отсчетов для DHT
 
float vols[SAMPLES];
float prevAmpls[SAMPLES]; // Предыдущие значения амплитуд
 
 
Adafruit_NeoPixel display(256, 12, NEO_GRB + NEO_KHZ800);
 
 
void draw(int x, int y, int r = 255, int g = 255, int b = 0) {
  int i = 0; int h = y % 2;
  if (h == 0) {
    i = x + (y * 16);
  }
  else {
    i = (((y + 1) * 16) - 1) - x;
  }
  if (i < 0)i = 0;
  display.setPixelColor(i, r, g, b);
  display.show();
}
 
 
void setup() {
  Serial.begin(9600);
  display.begin();
  display.setBrightness(20);
  //includeCanvas(display);
}
 
 
void loop() {
  display.clear();
  line(0, 7, 15, 8);
  display.show();
 
 
  // Один измерительный сигнал нужно проигнорировать
  analogRead(A0);
 
 
  // Затем считываем оставшиеся 16 значений
  for (uint8_t i = 0; i < SAMPLES; i++) {
    vols[i] = analogRead(A0);
    if(vols[i] < 10) vols[i] = 0;
  }
 
  float ampls[SAMPLES];
  DHT(vols, SAMPLES, ampls);
 
 
  // Вычисляем амплитуды с использованием преобразования Хартли
  for (uint8_t i = 0; i < SAMPLES; i++) {
   // Serial.print(vols[i]); Serial.print(", "); Serial.println(ampls[i]);
  }
 // Serial.println("---------------");
 
 
  // Отображаем результат на LED-матрице
  for (uint8_t g = 0; g < SAMPLES; g++) {
    smoothOutputOnDisplay(ampls[g], g);
  }
}
 
void DHT(float h[], int N, float H[]) {
  for (int k = 0; k < N; k++) {
    float sum = 0;
    for (int n = 0; n < N; n++) {
      sum += h[n] * (cos(2 * PI / N * (n + 0.5) * k) + sin(2 * PI / N * (n + 0.5) * k));
    }
    H[k] = fabs(sum);
  }
}
 
void smoothOutputOnDisplay(float ampl, uint8_t pos) {
  int normalizedAmplitude; int normalizedAmplitudeUD;
  switch(int(ampl)){
    case 0:
    normalizedAmplitude = 0;
    normalizedAmplitudeUD = 7;
    break;
    case 1:
    normalizedAmplitude = 1;
    normalizedAmplitudeUD = 6;
    break;
    case 2:
    case 3:
    normalizedAmplitude = 2;
    normalizedAmplitudeUD = 5;
    break;
    case 4:
    normalizedAmplitude = 3;
    normalizedAmplitudeUD = 4;
    break;
    case 5: 
    normalizedAmplitude = 4;
    normalizedAmplitudeUD = 3;
    break;
    case 6:
    case 7:
    normalizedAmplitude = 5;
    normalizedAmplitudeUD = 2;
    break;
    case 8:
    normalizedAmplitude = 6;
    normalizedAmplitudeUD = 1;
    break;
    default:
    normalizedAmplitude = 7;
    normalizedAmplitudeUD = 0;
    break;
  }
  normalizedAmplitudeUD = 7 - normalizedAmplitude;
  normalizedAmplitude += 8;
 
  line(pos, 8, pos, normalizedAmplitude);
  line(pos, normalizedAmplitudeUD, pos, 7);
  Serial.println(normalizedAmplitudeUD);
}
 
 
void line(int x, int y, int ex, int ey){
  for(int i = x; i <= ex; i++){
    for(int h = y; h <= ey; h++){draw(i, h); }
  }
}
Вроде все работает, но мне кажется, что тут что-то не так. Извините за все, я просто новичок еще)
На комменты внимания не обращайте, использовал GPT, но хочется узнать мнение знающих людей
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.04.2024, 17:56
Ответы с готовыми решениями:

Rgb matrix (64х32) P3 анализатор спектра (Arduino)
Здравствуйте форумчане! Я студент, многих тонкостей не знаю, так что не обессудьте. Я хочу сделать...

Как сделать анализатор спектра звука средствами NET
Возможно ли разложить звук на частоты и написать анализатор спектра средствами NET в PascalABC.NET ?

MMX для дискретного преобразования Хартли
Имеется задача необходимо генерировать сигнал (создать массив данных) на языке высокого уровня....

Proteus. Анализатор спектра
Есть провод с сигналом, надо снять его спектр. Есть ли в протеусе спектрограф, и если да - как им...

5
6 / 3 / 3
Регистрация: 05.04.2024
Сообщений: 13
29.04.2024, 18:15 2
Вроде как всё нормально.
0
1 / 1 / 0
Регистрация: 01.11.2022
Сообщений: 78
01.05.2024, 19:41  [ТС] 3
Хорошо, что все хорошо. Но теперь у меня проблема: я хочу сделать плавную анимацию полосок, но они выводятся последовательно, и я не знаю, как сделать вывод одновременно ВСЕХ полосок чтобы они не прогружались очередью:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
#include <Adafruit_NeoPixel.h>
//#include "NeoPixelPrint.h"
#include <math.h>
 
const int SAMPLES = 16;  // Количество отсчетов для FFT
 
float vols[SAMPLES];
float prevAmpls[SAMPLES]; // Предыдущие значения амплитуд
 
 
Adafruit_NeoPixel display(256, 12, NEO_GRB + NEO_KHZ800);
 
 
void draw(int x, int y, int r = 255, int g = 255, int b = 0) {
  int i = 0; int h = y % 2;
  if (h == 0) {
    i = x + (y * 16);
  }
  else {
    i = (((y + 1) * 16) - 1) - x;
  }
  if (i < 0)i = 0;
  display.setPixelColor(i, r, g, b);
  display.show();
}
 
 
void setup() {
  Serial.begin(9600);
  display.begin();
  display.setBrightness(20);
  //includeCanvas(display);
  line(0, 7, 15, 8, 0);
  display.show();
}
 
 
void loop() {
  // Один измерительный сигнал нужно проигнорировать
  analogRead(A0);
 
 
  // Затем считываем оставшиеся 16 значений
  for (uint8_t i = 0; i < SAMPLES; i++) {
    vols[i] = analogRead(A0);
    if(vols[i] < 10) vols[i] = 0;
  }
 
  float ampls[SAMPLES];
  DHT(vols, SAMPLES, ampls);
 
 
  // Вычисляем амплитуды с использованием преобразования Хартли
  for (uint8_t i = 0; i < SAMPLES; i++) {
   // Serial.print(vols[i]); Serial.print(", "); Serial.println(ampls[i]);
  }
 // Serial.println("---------------");
 
 
  // Отображаем результат на LED-матрице
  for (uint8_t g = 0; g < SAMPLES; g++) {
    smoothOutputOnDisplay(ampls[g], g);
  }
}
 
void DHT(float h[], int N, float H[]) {
  for (int k = 0; k < N; k++) {
    float sum = 0;
    for (int n = 0; n < N; n++) {
      sum += h[n] * (cos(2 * PI / N * (n + 0.5) * k) + sin(2 * PI / N * (n + 0.5) * k));
    }
    H[k] = fabs(sum);
  }
}
 
void smoothOutputOnDisplay(float ampl, uint8_t pos) {
  int normalizedAmplitude; int normalizedAmplitudeUD;
  switch(int(ampl)){
    case 0:
    normalizedAmplitude = 0;
    normalizedAmplitudeUD = 7;
    break;
    case 1:
    normalizedAmplitude = 1;
    normalizedAmplitudeUD = 6;
    break;
    case 2:
    case 3:
    normalizedAmplitude = 2;
    normalizedAmplitudeUD = 5;
    break;
    case 4:
    normalizedAmplitude = 3;
    normalizedAmplitudeUD = 4;
    break;
    case 5: 
    normalizedAmplitude = 4;
    normalizedAmplitudeUD = 3;
    break;
    case 6:
    case 7:
    normalizedAmplitude = 5;
    normalizedAmplitudeUD = 2;
    break;
    case 8:
    normalizedAmplitude = 6;
    normalizedAmplitudeUD = 1;
    break;
    default:
    normalizedAmplitude = 7;
    normalizedAmplitudeUD = 0;
    break;
  }
  normalizedAmplitudeUD = 7 - normalizedAmplitude;
  normalizedAmplitude += 8;
 
  line(pos, 8, pos, normalizedAmplitude, 20);
  line(pos, normalizedAmplitudeUD, pos, 7, 20);
 
  lineOFF(pos, 8, pos, normalizedAmplitude, 20);
  lineOFF(pos, normalizedAmplitudeUD, pos, 7, 20);
}
 
 
void line(int x, int y, int ex, int ey, int del){
  for(int i = x; i <= ex; i++){
    for(int h = y; h <= ey; h++){draw(i, h); delay(del);}
  }
}
 
void lineOFF(int x, int y, int ex, int ey, int del){
  for(int i = x; i <= ex; i++){
    for(int h = y; h <= ey; h++){draw(i, h, 0, 0, 0); delay(del);}
  }
}
0
681 / 290 / 75
Регистрация: 07.01.2023
Сообщений: 1,209
02.05.2024, 07:24 4
Цитата Сообщение от Mr_Earner_228 Посмотреть сообщение
и я не знаю, как сделать вывод одновременно ВСЕХ полосок
Экранный буфер. И потом выводить на экран, только те области, которые были изменены.
Вот вам пример такого обновления для LCD22 ( контроллер BD663474)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
void LCD22::update() {
 
    uint16_t *p = _screen;
    uint16_t *p1 = _fb.frame();
 
    for(int y = 0;y<PHYS_W;y++) {
            if(bcmp(p1, p, sizeof(uint16_t)*PHYS_H) != 0) {
                LCD_WRITE_COMMAND(0x210, PHYS_W-y-1);
                LCD_WRITE_COMMAND(0x211, PHYS_W-y-1);
                LCD_WRITE_COMMAND(0x212, 0);
                LCD_WRITE_COMMAND(0x213, PHYS_H-1);
                LCD_WRITE_COMMAND(0x200, PHYS_W-y-1);
                LCD_WRITE_COMMAND(0x201, 0);
                LCD_WRITE_R(0x202);
                LCD_WRITE_DATA(p1,PHYS_H);
                memcpy(p, p1, PHYS_H*sizeof(uint16_t));
            }
        p+=PHYS_H; p1+=PHYS_H;
    }
}
где screen и _fb.frame() соответственно
uint16_t _screen[PHYS_W * PHYS_H];
Рисуем в _fb.frame() а в айдле апдейтим экран.
P.S. Это писалось под 128 мегу, поэтому на памяти экономить не было резона.
0
1 / 1 / 0
Регистрация: 01.11.2022
Сообщений: 78
02.05.2024, 16:31  [ТС] 5
Если честно, не очень понятно. Как это работает, что такое screen и _fb.frame(). Я не понял, как это должно работать. Извините за непонятки, новичок еще/
0
681 / 290 / 75
Регистрация: 07.01.2023
Сообщений: 1,209
02.05.2024, 18:24 6
Цитата Сообщение от Mr_Earner_228 Посмотреть сообщение
Как это работает, что такое screen и _fb.frame()
screen и fb это два массива uint16_t. Это буфера экрана. uint16_t потому что у экрана цветовая схема RGB655 Обновляются только те строки, которые были изменены.
Ну и естественно никакого кода arduino библиотек, все на чистом си.
Если у вас проблема с памятью, то используйте один буфер, обновляете его во время айдла,и для экономии памяти можете использовать палитру и индексные цвета
LCD_WRITE_COMMAND работает так
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
void  __attribute__((optimize("O0"))) SPI_BYTE(const uint8_t val) {
     SPDR = val;
     while(!(SPSR & _BV(SPIF)))
         wdt_reset();
}
 
void SPI_WORD(const uint16_t val) {
    const uint8_t *p = (const uint8_t *)&val;
        SPI_BYTE(p[1]); SPI_BYTE(p[0]);
}
 
void LCD22::LCD_WRITE_COMMAND(const uint16_t r, const uint16_t d) {
  PORT_RS &= ~_BV(PIN_RS);
  PORT_CS &= ~_BV(PIN_CS);
  SPI_WORD(r);
  PORT_RS |= _BV(PIN_RS);
  PORT_CS |= _BV(PIN_CS);
  PORT_CS &= ~_BV(PIN_CS);
  SPI_WORD(d);
  PORT_CS |= _BV(PIN_CS);
}
0
02.05.2024, 18:24
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.05.2024, 18:24
Помогаю со студенческими работами здесь

10-ти полосный анализатор спектра
Доброго дня всем! Надумал я сделать анализатор спектра по материалам которые находятся тут...

Анализатор спектра тормозит
Привет! Собственно суть проблемы в названии темы. Вот отрывки кода отвечающие за визуализацию....

"Нестандартный" анализатор спектра
В последнее время озадачился я изучением алгоритмов цифровой обработки сигналов. Добрался до...

Анализатор спектра видеофайлов в Proteus
Помогите, пожалуйста, собрать и написать программу на си анализатора спектра видеофайлов в Proteus.

Анализатор спектра на 128 полос
Всем привет. Нужен анализатор спектра для &quot;украшения&quot; колонок. Под дисплей 64*128 Недавно...

сонограф (анализатор спектра) на stm
есть такая замечательная прога spectraplus, показывающая в реальном времени сонограмму звуков. если...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru