Зачем использовать несколько фильтров, выводящих тысячи значений, использовать один или два фильтра, которые могут выводить нормальное значение?

Проблема

Если цикл запускает только один смоделированный вывод и использует фильтр, он будет выводиться нормально (аналоговый 1600 ~ 2200, фильтр 0 ~ 500), но создание массива для хранения нескольких отфильтрованных смоделированных значений выводов вызовет проблемы, и вывод будет ненормальным (10000 ~ 80000).

2022-04-15--15-00-07_fps=8_scale=720_max_colors=128|690x298

Если аналоговый считывает шесть датчиков, то их значение равно 1600 ~2200.

Он использовал приведенный ниже код.

#include "EMGFilters.h"
#define SERIAL_TX_BUFFER_SIZE 4096 //修改串口接收缓冲区大小为2048
const int SensorInputPin[] = {A0, A1, A2, A3, A4, A5};
EMGFilters myFilter[6];
SAMPLE_FREQUENCY sampleRate = SAMPLE_FREQ_500HZ;
NOTCH_FREQUENCY humFreq = NOTCH_FREQ_50HZ;

void setup()
{

    for (int i = 0; i < 6; i++)
    {
        myFilter[i].init(sampleRate, humFreq, true, true, true);
    }
    Serial.begin(115200);
    Serial1.begin(250000);
    analogReadResolution(12);
}
void loop()
{
    long time = millis();
    int x[6] = {0,0,0,0,0,0};
    int analog[6] = {0,0,0,0,0,0};

    for (int index = 0; index < 6; index++)
    {
        //x[index] = myFilter[index].update(analogRead(SensorInputPin[index]));
        analog[index] = analogRead(SensorInputPin[index]);
    }
    while ((millis() - time) < 2)
    {
        delayMicroseconds(100);
    }
    Serial.printf("filter:%d %d %d %d %d %d analog:%d %d %d %d %d %d\n", x[0], x[1], x[2], x[3], x[4], x[5],analog[0],analog[1],analog[2],analog[3],analog[4],analog[5]);
    Serial1.printf("<%d,%d,%d,%d,%d,%d>", x[0], x[1], x[2], x[3], x[4], x[5]);
}

Измените индекс<6 на индекс<2и раскомментируйте \\x[index] = myFilter[index].update(analogRead(SensorInputPin[index]));

Это будет обычный вывод с использованием двух входов и фильтров.

2022-04-15--15-15-26_fps=8_scale=720_max_colors=128|690x341

Но изменение index=0;index<2 на index=0;index<6 будет ненормальным результатом. 2022-04-15--15-29-32_fps=8_scale=720_max_colors=28|690x323

Если изменить на index=3; index<4 или index= 2; index<3... и т.д., это будет нормальный результат: 2022-04-15--15-15-43_fps=8_scale=720_max_colors=128|690x459

Скетч: image|470x500 image|667x500

Схема XIAO MCU в формате HTML: https://files.seeedstudio.com/wiki/Seeeduino-XIAO/res/Seeeduino-XIAO-v1.0-SCH-191112.pdf

У меня нет схемы датчика.

Код фильтра: https://github.com/oymotion/EMGFilters/blob/master/EMGFilters.cpp

Я надеюсь, что каждый вывод моделирования будет выглядеть как первый Gif (обычный вывод), что я должен сделать, чтобы достичь этого?

, 👍1

Обсуждение

Вам нужен один фильтр на вход ...?, @Majenko

Вы не предоставили никакого контекста о том, что вы на самом деле измеряете, но я поддерживаю Majenko с предположением, что вам нужен один фильтр на аналоговый вход. Кроме того, я не совсем понимаю описание вашей проблемы. Если это из-за языкового барьера, возможно, вам сможет помочь кто-нибудь, кто лучше говорит по-английски, и поможет с формулировкой вопроса., @chrisl

@Majwnko да. Есть ли какой-нибудь способ решить эту проблему?, @C.SH.K

@chrisl Мне очень жаль, возможно, я не так свободно владею английским, как моим родным языком. Я надеюсь, что каждый результат моделирования будет выглядеть как первый Gif-файл., @C.SH.K

В настоящее время вы используете только один фильтр: myFilter. Но вы можете определить несколько фильтров таким же образом и поместить их в массив для использования в цикле for. Что-то вроде этого: EMGFilters myFilters[6]; (определите массив из 6 EMGFilters). В setup(): for(int i=0;i<6;i++) myFilters[i].init(SampleRate, humFreq, true, true, true);. И в цикле for: envelopes[i * 6 + x] = square(myFilters[x].update(analogRead(SensorInputPin[x])));., @chrisl

Но я думаю, вам также нужно подумать о том, что вы выводите. В настоящее время вы пытаетесь вывести значения отдельных датчиков в каждой новой строке. Последовательный плоттер интерпретирует это как новые точки данных того же сигнала, хотя на самом деле у вас есть 6 точек данных, по одной для каждого сигнала. Я думаю, что последовательный плоттер поддерживает построение нескольких строк, когда вы печатаете точки данных в одной строке, разделенной пробелом., @chrisl

@chrisl Я попытался создать фильтр для смоделированного вывода, но результат по-прежнему ненормальный (сообщение было обновлено, и изображение было загружено). Функция цикла выводит данные нормально, только если у нее есть только одна строка команды quare(myFilter.update(analogRead(SensorInputPin[на вход])))`. Я не понимаю, почему только одна строка должна выводиться нормально., @C.SH.K

@chrisl Я обнаружил ошибку с использованием третьего аналогового ввода, как вы думаете, в чем причина? Я измерил третий аналоговый вход отдельно и не обнаружил никаких проблем. Кажется, что до тех пор, пока я использую третий вывод, независимо от того, что это за третий аналоговый вывод, он выдает тысячи значений. Проблема была обновлена., @C.SH.K

Какую плату Arduino вы используете? Вы предполагаете, что каждое целое число имеет длину 2 байта, это верно, если вы используете Arduino Uno, но это будет не так, если вы используете Arduino на основе STM32 или SAMD, для них Int равен 4 байтам., @hcheung

@chrisl Привет, я восстановил сообщение., @C.SH.K

@hcheung Хорошо. Я был обновлен., @C.SH.K


1 ответ


Лучший ответ:

2

Это ошибка в библиотеке фильтров, которую вы используете. Об этом уже сообщалось (может быть, вами?).

Как предположили Majenko и chrisl в комментариях, суть проблемы заключается в том, что вам нужен один фильтр на входной канал. Использование нескольких экземпляров EMGFilters кажется очевидным решением. Увы, библиотека сохраняет состояние фильтра в глобальных переменных, что по сути означает, что все ваши шесть объектов фильтра ссылаются на один и тот же фактический фильтр.

,

ДА. Это моя проблема. Как мне предотвратить ссылки на глобальные переменные одного и того же фильтра? Нужно ссылаться на "EMGFilters1.h", "EMGFilters2.h" ... и т.д.?, @C.SH.K

@C.SH.K: Нет. Вы должны исправить библиотеку или подождать, пока авторы исправят ее. Если вы хотите сделать это самостоятельно, просто превратите состояние фильтра в данные экземпляра. C.f. мой комментарий к вашей проблеме., @Edgar Bonet

@C.SH.K: Или вы можете использовать ветку из [этого запроса на извлечение] (https://github.com/oymotion/EMGFilters/pull/4 )., @Edgar Bonet

Спасибо! Решена насущная проблема!, @C.SH.K

[Изображение](https://i.stack.imgur.com/ckaNR.png ) [Изображение 2](https://i.stack.imgur.com/uzcRR.gif ) После использования вашего файла некоторые пины занимают странное место, некоторые ЭМГ выводят десятки тысяч значений, некоторые - обычный вывод. Раньше, с необработанным кодом фильтра, он печатался бы следующим образом[Before index=0;index<1...etc](https://aws1.discourse-cdn.com/arduino/original/4X/0/5/8/05885f12cbba1c227d4f4349a169a8979a2f8caa.gif), @C.SH.K

О. Просто плохой контакт с датчиком ОБЛАСТЬ датчика, которую я купил, слишком велика, поэтому сухому электроду нелегко полностью соприкасаться с кожей при касании руки, которая склонна к смещению базовой линии., @C.SH.K