Идентификация/генерация сигнала?

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

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

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


person Paul    schedule 13.09.2011    source источник
comment
Является ли сигнал шумным? Ты знаешь частоту? Вы знаете амплитуду? В общем, это сложная проблема.   -  person Oliver Charlesworth    schedule 14.09.2011
comment
Ознакомьтесь с этой бесплатной книгой Руководство для ученых и инженеров по цифровой обработке сигналов.   -  person Bala R    schedule 14.09.2011
comment
Прости; Я должен был упомянуть, что это будет на известной частоте, а амплитуда должна быть неизвестна.   -  person Paul    schedule 14.09.2011


Ответы (3)


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

    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 здесь обновляется в каждом кадре формы волны и зависит от частоты волны, которую вы создаете.

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

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

person Alex    schedule 14.09.2011

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

person Mark Edwards    schedule 13.09.2011
comment
Это не решает реальную проблему, а именно классификацию сигналов. - person Oliver Charlesworth; 14.09.2011
comment
В частотной области упомянутая пара различных волновых форм должна быть довольно отличительной. - person Phil Miller; 14.09.2011

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

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

person arne    schedule 14.09.2011