Идентификация / генерация сигнала? - PullRequest
1 голос
/ 14 сентября 2011

Я хотел бы закодировать что-то, что могло бы принять какой-то ввод и идентифицировать это как прямоугольную волну, треугольную волну или какую-то форму волны. Мне также нужен какой-то способ генерации упомянутых волн.

У меня есть опыт работы с C / C ++, однако я не уверен, как бы я подошел к симуляции всего этого. В конце концов, я хотел бы перевести его в программу микроконтроллера для считывания его аналогового входа для определения формы сигнала.

РЕДАКТИРОВАТЬ: Извините; Я должен был упомянуть, что это будет на известной частоте, а амплитуда должна быть неизвестна.

Ответы [ 3 ]

3 голосов
/ 14 сентября 2011

Генерация волн значительно проще, чем их идентификация. У меня есть небольшой проект, который делает некоторые волны. Вот пример из моего проекта :

    float amplitude;
    switch (sound->wavetype)
    {
        case LA_SQUARE:
            amplitude = sound->theta > .5 ? 1.0 : -1.0;
            break;
        case LA_SINE:
            amplitude = sin(2 * PI * sound->theta);
            break;
        case LA_TRIANGLE:
            amplitude = sound->theta > .5 ? 4 * sound->theta - 3 : -4 * sound->theta + 1;
            break;
        case LA_SAWTOOTH:
            amplitude = 2 * sound->theta - 1.0;
            break;
        case LA_NOISE:
            amplitude = ((float)rand() / RAND_MAX);
            break;
        default:
            ;
    }

theta здесь обновляется в каждом кадре вдоль формы волны и зависит от частоты волны, которую вы создаете.

Что касается идентификации волн, если вы знаете, что будете получать простые, несмешанные квадратные, треугольные или синусоидальные волны, вы, вероятно, можете просто провести несколько простых тестов. Посмотрите на изменение амплитуды в любых двух точках вдоль волны. Если они одинаковые, прямоугольная волна. Если они изменяются линейно (то есть, если изменение амплитуды постоянно), у вас есть треугольная волна (или пилообразная, если вы делаете это различие). В противном случае, это синусоида. Имейте в виду, что эта проверка работает, только если вы ожидаете только эти типы волн, и они не смешиваются или что-то еще. Я могу подумать о некоторых других крайних случаях, но я позволю вам беспокоиться об этом.

Если вы делаете что-то более необычное, вам, вероятно, нужно поискать книгу, которая специализируется на подобных вещах, например, предложенную в разделе комментариев.

0 голосов
/ 14 сентября 2011

Для идентификации сигналов: если вы знаете частоту, вы можете многое сделать, используя дискретные градиенты, как предлагает Алекс в своем ответе.

Другой метод - это использовать метод интерполяции и посмотретьна коэффициентах.Еще одним будет быстрое преобразование Фурье.Последние два являются в вычислительном отношении более интенсивными, но также и намного более точными, особенно при идентификации более сложных сигналов.Вам нужно посмотреть, достаточно ли быстро работает ваш ОК или, если вам повезет, аппаратное БПФ.

0 голосов
/ 14 сентября 2011

Начните с MATLAB или бесплатной рабочей среды GNU Octave.Вы можете генерировать массивы с желаемыми формами сигналов и писать соответствующие функции для декодирования / идентификации.Когда вы проработаете детали, возьмите копию библиотеки FFTW (самая быстрая трансформация Фурье на западе) для обработки подпрограмм fft / ifft для вашего кода c / c ++.Модуль обработки сигналов MATLAB имеет множество полезных инструментов для достижения вашей цели.

...