Цифровые фазовращатели в SDR технике

Posted on 2017-01-18 22:35:25

В SDR технике часто применяется квадратурное представление сигналов. Ниже представлены варианты цифровых фазовращателей, для формирования квадратурного сигнала гетеродина приемника или передатчика.

Самая распостраненная схема в SDR технике - счетчик Джонсона. Вход - LOin, на выходах CLK0 и CLK1 сдвинутые на 90 град друг относительно друга меандры. При этом на входе скважность сигнала может быть любая.

Johnson Counter SDR

Из недостатков можно отнести то, что выходная частота в четыре раза меньше входной. Из - за этого максимальная выходная частота такого формирователя равна примерно ~ 40 .. 55 МГц, если применять 74LVC74.

Вторая схема делит входную частоту на 2, но имеет еще более худшую точность, чем первая схема. Логические элементы "Исключающее ИЛИ" формируют прямой и инверсный сигналы, которые подаются на два независимых триггера, которые и делят частоту на два (180 град / 2 = 90 град). Недостаток схемы - неопределенность I и Q выхода при подаче питания. Теоретически можно устранить, заменив элементы "исключающее или" на один инвертор (не проверял, поэтому не могу утверждать), но тогда ухудшится точность получения фазового сдвига, которая к тому же теперь будет зависеть от входной частоты.

Цифровой фазовращатель

Ну и последний вариант на RC - цепочке. Входная частота равна выходной, из - за этого ограничен диапазон частот работы фазовращателя.

RC-фазовращатель для SDR приемника

На одной RC цепочке невозможно получить фазовый сдвиг в 90 град., потому что в таком случае выходное напряжение фазовращателя будет равно нулю. Нужно минимум две RC - цепочки, каждая из которых дает вклад в 45 град, а между ними стоит усилитель, который нормирует сигнал к логическому уровню. В качестве усилителя применен инвертор. Такая схема оптимальна для простых SDR приемников, если в качестве гетеродина применен LC - генератор. Неточность фазового сдвига компенсируется алгоритмами автоматической компенсации дисбаланса при цифровой обработке сигнала. Сдвиг в 90 град не является обьязательным условием, он может быть и 110 или 20 град ... Так что по большому счету, неточность фазового сдвига в таком случае ни на что не влияет. Это даже можно использовать как полезное свойство! Зависимость фазового сдвига от частоты линейна, а значит по измеренной фазовой ошибке можно ориентироваочно узнать, на какой частоте работает приемник, без использования частотомера! Я подумывал реализовать такую функциональность в UnoSDR, но пока отложил в ящик.

Параметры RC цепочки расчитываются так, что бы в верхней рабочей частоте фазовый сдвиг был не более 45 град, так как с повышением частоты падает уровень выходного сигнала, т.е. активное сопротивление должно быть равно реактивному - 1/(6.28*C*F).

 

Простой SDR приемник для звуковой карты

Posted on 2016-12-25 23:11:25

В интернете существует множество простых схем sdr приемников для звуковой карты, и многие из них я собственноручно собирал. Но, как оказалось, в каждой из них был какой то изьян, и в результате я был полностью не удовлетворен работой схемы. В некоторых наблюдались повышенные фликер - шумы, из - за чего на спекрте в центре образовывался характерный "горб". В некоторых схемах была повышенная чувствительность к НЧ наводкам на вход, или на прямой и инверсные входы ОУ смещение приходило по разным путям, вследствие чего нельзя было выставить большое усиление, т.к. ОУ входил в насыщение. Путем проб и ошибок была разработана оптимальная на мой взгляд схема, которая представлена ниже.

Простой SDR приемник для звуковой карты

ОУ включен для однополярного питания. Смещение подается на неинвертирующий вход. Блягодаря этому усиление ОУ можно выставлять достаточно большим. Цепочка C2 C3 R3 R4 создает ВЧ фильтр, с помощью которого уменшается усиление на НЧ, на частотах, близких к нулю.  Сигнал гетеродина подается на вход LOin.

Но.. и эта схема имеет недостаток, или особенность применения. Она расчитана на питание от батарейки, или от импульсного блока питания с малыми пульсациями сетевой частоты. Если вы планируете применять линейный блок питания, вам нужно позаботиться о хорошем фильтре, или применять двухполярное питание.

Так же, если вы наблюдаете помехи от компьютера, рекомендую прочесть эту статью

На последок, фото моей конструкции на макетной плате:

simple sdr receiver for soundcard

И обратная сторона:

простой sdr приемник для звуковой карты

SDR приемник на звуковой карте поддерживает программа UnoSDR и QuestaSDR а так же android приложение в виде клиент - серверной архитектуры.

Защита Qt приложения от модификации

Posted on 2016-12-12 23:59:42

Рано или поздно при распостранении приложения, написанного с помощью Qt возникают два вопроса:

В этой статье рассматривается второй вопрос, а именно проверка на целостность исполняемого файла. Зачем это нужно? Вы не можете быть уверены, что скомпилированный вами файл останется без изменения на машине пользователя. Вирусы, нежелательное ПО, которое встраивается в файлы, банально неисправное оборудование пользователя. Во всех этих случаях ваша программа может работать не так как следует, сбоить, а то и вовсе крэшится. А это влияет на репутацию как программы, так и вас, вашей компании. Встроить проверку на целостность файла не займет много времени, и в итоге вы поимеете только плюсы.

Как же это работает? Очень просто. Подсчитываем CRC исполняемого файла за исключением области, где хранится эталонное значение, и сравниваем с ним. Если сходится - все Ок, в противном случае нужно уведомить пользователя, и порекомендовать скачать исправную версию с сайта. Для CRC есть специальная область в заголовке exe файла - байты 18 и 19, считая от нуля. Туда и будем записывать эталонное значение.

Пример кода из программы UnoSDR подсчета CRC:

bool App::checkSelfCRC()
{
#ifdef Q_OS_WIN
    QByteArray ba;
    quint16 hash = 0, selfHash = 0;
    qint64 time = QDateTime::currentMSecsSinceEpoch();
    //
    QFile file(qApp->applicationFilePath());
    if(file.open(QIODevice::ReadOnly))
    {
        ba = file.readAll();
        file.close();
        //
        if(ba.size() > 20)
        {
            for(qint64 i = 0; i < 18; i++)
            {
                hash += ba.at(i);
                hash += (hash << 10);
                hash ^= (hash >> 6);
            }
            //
            for(qint64 i = 20; i < ba.size(); i++)
            {
                hash += ba.at(i);
                hash += (hash << 10);
                hash ^= (hash >> 6);
            }
            // read saved crc
            selfHash = ba.at(18) | (quint16)ba.at(19) << 8;
            qDebug() << "calculate self crc" << hash << selfHash << "time, ms:" << QDateTime::currentMSecsSinceEpoch() - time;
        }
        else
        {
            qDebug() << "Error calc self crc - error ba size <= 20" << ba.size();
        }
    }
    else
    {
        qDebug() << "Error calc self crc - error open exe file" << file.errorString();
    }
    return selfHash == hash;
#else
    return true;
#endif
}

Используется хэш Дженкинса. В случае, если возникает ошибка открытия файла, что не исключено, функция возвращает true. Так же, если операционная система не Windows, потому что мы используем специфичный для Windows заголовок исполняемого файла.

Это еще не все. Нам нужно как то записать эталонную CRC при деплое приложения. Консольная утилита:

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    QByteArray ba;
    quint16 hash = 0;
    //
    QFile file("../bin/UnoSDR.exe");
    if(file.open(QIODevice::ReadWrite))
    {
        ba = file.readAll();
        if(ba.size() > 20)
        {
            for(qint64 i = 0; i < 18; i++)
            {
                hash += ba.at(i);
                hash += (hash << 10);
                hash ^= (hash >> 6);
            }
            //
            for(qint64 i = 20; i < ba.size(); i++)
            {
                hash += ba.at(i);
                hash += (hash << 10);
                hash ^= (hash >> 6);
            }
            // write crc
            ba.clear();
            ba.append(hash & 255);
            ba.append(hash >> 8);
            file.seek(18);
            file.write(ba);
        }
        else
        {
            qDebug() << "Error calc self crc - error ba size <= 20" << ba.size();
        }
        file.close();
    }
    else
    {
        qDebug() << "Error calc self crc - error open exe file" << file.errorString();
    }

    return a.exec();
}

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

Купил ИШИМ 003

Posted on 2016-12-03 23:11:09

Как то зашел случайно на olx на свою голову, и как результат, заказал себе еще один приемник ИШИМ 003 - теперь у меня их два)

ИШИМ 003

Правда, оказалось, что не работает КВ - 1, сбиты настройки контуров, громкость не уменьшается регулятором до минимума, из - за переделки УНЧ, а так же верньер более тугой, чем в приемнике под ним. Передняя и задняя панель полностью пластмассовая. Но, покупкой, в принципе не разочарован.

First 1 2 3 4 5 6 7 8 9 10 11 12 13 14 Last