[Из песочницы] Разработка многоканального SDR
Много лет работаю в области создания средств захвата и обработки сигналов от бортовых и береговых навигационных РЛС. Примерно года два назад выпустил последнюю, на сегодняшний день, версию нашей платы RVAQ (Radar Video AcQuisition) и задумался, чем в жизни заняться дальше. Хотелось чего-то нового и неизведанного. Выбор пал на неохваченную мной до сих пор область — цифровой радиоприем с легким заходом в СВЧ-область.
Это первая глава, посвященная начальной постановке задачи.
С чего начать, если никогда профессионально не занимался цифровым радиоприемом, если не считать приемник «Мишутка», собранный в детстве? Конечно, с освежения памяти чтения Полякова и модели в MATLAB. Исходной идеей являлось создание многоканального приемника диапазона 156-162МГц для мониторинга и записи всех активных переговоров в морском УКВ-диапазоне. Перечислю желаемые свойства такого приемника:
1. Полоса приема не менее 6 МГц (162-156=6)
2. Чувствительность не хуже -110дБм, а то засмеют
3. Большой динамический диапазон, так как когда слушаешь на берегу судно в море за 30 миль, рядом обязательно кто-то заорет своими 25-ю ваттами. Для приличных приемников уровень блокирования должен быть не меньше 70дБ. Забегая немного вперед, скажу, что получилось реализовать более 90дБ по блокированию. Одним словом, RTL-SDR решительно не соответствовал ожиданиям. Прикидку начал, как ни странно, с выбора АЦП. Так как если в природе нет соответствующих (хотя бы в теории) АЦП, то и браться не стоит. Такой АЦП нашелся.
Теперь нужно выбрать архитектуру приемника. Обзор актуальных решений, изучение элементной базы и интуиция позволили остановиться на приемнике прямого преобразования. Также решено было перенести в ноль частоты интересующий участок спектра при помощи квадратурного демодулятора и работать в первой зоне Найквиста, чтобы максимально утилизировать все качества выбранного АЦП.
clear all; k = 1.381e-23; % Joule/K - Boltzmann's Constant T0 = 290; % K - temperature % Encoding Windows-1251 % 1. Функциональная схема % 1010 - Схема защиты входных каскадов % 1011 - Преселектор % 1012 - Управляемый МШУ (вкл/выкл.) % 1013 - Фильтр основной селекции % 1014 - Управляемый усилитель петли АРУ % 1015 - Квадратурный смеситель % 1021, 1022 - Фильтры низкой частоты. % 1031, 1032 - Низкочастотные усилители % 1041, 1042 - Фильтры низкой частоты АЦП % 1051, 1052 - АЦП % 2. Системная диаграмма радиотракта для анализа мощности шумов и чувствительности Rrf_inp_ohm = 50; % Ohm - входной импеданс. % 2011 - Преселектор BWrf_ekv_prf_hz = 20.0e6; % Hz - Эквивалентная полоса пропускания преселектора Lrf_max_prf_db = 1.0; % dB - Максимальный уровень затухания преселектора в рабочей полосе РПУ (insertion loss) % 2012 - МШУ % (для примера взяты параметры Agilent MGA-71543 с учетом реализационных потерь) Grf_lna_db = 16.0; % dB - Коэффициент усиления МШУ NFrf_lna_db = 1.0; % dB - Коэффициент шума МШУ % 2013 - Фильтр основной селекции BWrf_ekv_fms_hz = 6.0e6; % Hz - Полоса пропускания фильтра основной селекции Lrf_max_fms_db = 4.0; % dB - Максимальный уровень затухания фильтра основной селекции в полосе пропускания (insertion loss) % 2014 - Усилитель высокой частоты % (для примера взяты параметры Agilent MGA-71543 с учетом реализационных потерь) Grf_amp_db = 16.0; % dB - Коэффициент усиления УВЧ NFrf_amp_db = 1.0; % dB - Коэффициент шума УВЧ % 2015 - Квадратурный смеситель % (для примера взяты параметры Analog Devices ADL5387) Grf_mix_db = 4.5; % dB - Коэффициент усиления квадратурного смесителя NFrf_mix_db = 15.0; % dB - Коэффициент шума квадратурного смесителя IP1dBrf_mix_dbw = 13.0 - 30.0; % dBW - Input P1dB (IP1dB) % 3. Системная диаграмма цифрового приемника для анализа чувствительности и максимально допустимого уровня блокирующего сигнала % 3011 - Радиотракт % Коэффициент шума радиотракта (db) NFrf_sys_db = pow2db( ( db2pow( Lrf_max_prf_db ) ) + ... ( db2pow( NFrf_lna_db ) + 1 ) / ( db2pow( -Lrf_max_prf_db )) + ... ( db2pow( Lrf_max_fms_db ) + 1 ) / ( db2pow( -Lrf_max_prf_db ) * db2pow( Grf_lna_db )) + ... ( db2pow( NFrf_amp_db ) + 1 ) / ( db2pow( -Lrf_max_prf_db ) * db2pow( Grf_lna_db ) * db2pow( -Lrf_max_fms_db )) + ... ( db2pow( NFrf_mix_db ) + 1 ) / ( db2pow( -Lrf_max_prf_db ) * db2pow( Grf_lna_db ) * db2pow( -Lrf_max_fms_db ) * db2pow( Grf_amp_db )) ... ); % Коэффициент усиления радиотракта (dB) Grf_sys_db = ( Grf_lna_db + Grf_amp_db + Grf_mix_db ) - ( Lrf_max_prf_db + Lrf_max_fms_db ); % Полоса сигнала на выходе радиотракта (Hz) BWrf_sys_hz = BWrf_ekv_fms_hz; % 3012 - Baseband LPF Lbb_lpf_db = 9; % dB - Максимальный уровень затухания Baseband LPF в полосе пропускания (insertion loss) % 3013 - Baseband УНЧ (LTC6400-14) Gbb_opa_db = 0; % dB - Коэффициент усиления УНЧ NFbb_opa_db = 0; % dB - Коэффициент шума УНЧ % Эквивалентный коэффициент усиления УНЧ, состоящего из фильтра и ОУ (dB) Gbb_lfa_db = Gbb_opa_db - Lbb_lpf_db; % Коэффициент шума системы от входа до выхода УНЧ (dB) - практически не поменялся. NFbb_sys_db = pow2db( ( db2pow( NFrf_sys_db ) ) + ... ( db2pow( NFbb_opa_db ) + 1 ) / ( db2pow( Grf_sys_db )) ... ); % Коэффициент усиления системы от входа до выхода УНЧ (dB) Gbb_sys_db = Grf_sys_db + Gbb_lfa_db; % Полоса сигнала в основной полосе (Hz) - не поменялась BWbb_sys_hz = BWrf_sys_hz; % Мощность шума на выходе УНЧ в основной полосе (dBW) PNbb_out_dbw = pow2db( k * T0 * BWrf_sys_hz ) + NFbb_sys_db + Gbb_sys_db; % 3014 - АЦП % (для примера взяты параметры 1 канала Linear Technology LTC2271) FSadc_hz = 20.0e6; % Hz - Sampling rate SNadc_fs_db = 84; % dB - SNR NBadc_fs_bits = 16; % bits - Full scale bits Vadc_fs_v = 2; % V - Full scale voltage Radc_inp_ohm = 1000; % Ohm - Input ADC resistance % Мощность синусоидального сигнала при размахе на полную шкалу для пары АЦП (dBW) PFSadc_inp_dbw = pow2db( 2.0 * (( Vadc_fs_v * 0.5 * sqrt( 0.5 )) ^ 2 ) / Radc_inp_ohm ); % Мощность собственного шума пары АЦП (dBW) PNadc_snr_dbw = PFSadc_inp_dbw - SNadc_fs_db; % Мощность шума квантования пары АЦП (dBW) PNadc_qan_dbw = PFSadc_inp_dbw - ( NBadc_fs_bits * mag2db( 2 ) + mag2db( sqrt( 6 ) / 2 )); % adding correction factor for sinusoidal signal % 3015 - Эквивалентная схема обработки сигнала с ЧМ SNfm_min_db = 12.0; % dB - минимальное отношение сигнал-шум для приема голосовых передач в режиме ЧМ BWfm_max_hz = 25.0e3; % Hz - максимальная ширина полосы канала, предназначенного для передачи речи BWfm_min_hz = 6.25e3; % Hz - минимальная ширина полосы канала, предназначенного для передачи речи % Чувствительность радиотракта (dBW) при идеальных АЦП и цифровой обработке канала передачи (минимальная мощность в полосе канала передачи) Pfm_min_dbw = pow2db( k * T0 * BWfm_max_hz ) + NFbb_sys_db + SNfm_min_db; % Мощность сигнала на выходе унч при синусоидальном входном сигнале, по уровню равным уровню чувствительности (dBW) Pfm_min_bb_sys_dbw = Pfm_min_dbw + Gbb_sys_db; % Мощность сигнала на входе смесителя. Такой сигнал после прохождения всех последующих каскадов % на выход АЦП даст размах полной шкалы (dBW) PFSmix_inp_dbw = PFSadc_inp_dbw - Gbb_lfa_db - Grf_mix_db; % Запас линейного участка передаточной характеристики смесителя (по входу) deltaPmix_inp_lin = IP1dBrf_mix_dbw - PFSmix_inp_dbw;
% Разрешение БПФ равно минимальной полосе канала Nfft = 2 * (( FSadc_hz / 2 ) / BWfm_min_hz ); Nsmp = Nfft; tmp_fft_buf = zeros( 1, Nfft ); tmp_acc_buf = zeros( 1, Nfft ); tmp_smp_buf = zeros( 1, Nsmp ); max_acc = 30; for acc = 1:max_acc % Принимаемый сигнал 1 % на входе приемного тракта - сигнал на уровне чувствительности приемного тракта % на входе АЦП - сигнал прошедший все каскады преобразования и усиления PS1 = db2pow( Pfm_min_bb_sys_dbw ); WS1 = 25.0e3; FS1 = 1.0e6; Fstart = FS1; Fstop = Fstart + WS1 - BWfm_min_hz; Pstep = PS1 / ( WS1 / BWfm_min_hz ); PS1_smp_buf = zeros( 1, Nsmp ); for f = Fstart:BWfm_min_hz:Fstop phi_acc = 2.0 * pi * rand( 1 ); % random phase phi_stp = pi * ( f / ( FSadc_hz / 2 )); for k = 1:Nsmp PS1_smp_buf( k ) = PS1_smp_buf( k ) + sqrt( Pstep ) * exp( j * phi_acc ); phi_acc = phi_acc + phi_stp; if( phi_acc > ( 2.0 * pi )) phi_acc = phi_acc - 2.0 * pi; else if( phi_acc < ( -2.0 * pi )) phi_acc = phi_acc + 2.0 * pi; end end end end % Принимаемый сигнал 2 % на входе приемного тракта - сигнал по уровню близок блокировке приемного тракта % на входе АЦП - сигнал прошедший все каскады преобразования и усиления PS2 = db2pow( PFSadc_inp_dbw - 1.0 ); % -1 dB back off WS2 = 25.0e3; FS2 = -2.0e6; Fstart = FS2; Fstop = Fstart + WS2 - BWfm_min_hz; Pstep = PS2; PS2_smp_buf = zeros( 1, Nsmp ); for f = Fstart:BWfm_min_hz:Fstop phi_acc = 2.0 * pi * rand( 1 ); % random phase phi_stp = pi * ( f / ( FSadc_hz / 2 )); for k = 1:Nsmp PS2_smp_buf( k ) = PS2_smp_buf( k ) + sqrt( Pstep ) * exp( j * phi_acc ); phi_acc = phi_acc + phi_stp; if( phi_acc > ( 2.0 * pi )) phi_acc = phi_acc - 2.0 * pi; else if( phi_acc < ( -2.0 * pi )) phi_acc = phi_acc + 2.0 * pi; end end end end % Шум на выходе унч основной полосы PN1 = db2pow( PNbb_out_dbw ); WN1 = BWbb_sys_hz; Pfull_bw = PN1 * ( FSadc_hz / WN1 ); PN1_smp_buf = sqrt( 0.5 * Pfull_bw ) * complex( randn( 1, Nsmp ), randn( 1, Nsmp )); tmp_fft_buf = fftshift( fft( PN1_smp_buf )); tmp_msk_buf = zeros( 1, Nfft ); tmp_msk_buf((( Nfft / 2 ) - (( WN1 / FSadc_hz ) * ( Nfft / 2 )) + 1 ) : (( Nfft / 2 ) + (( WN1 / FSadc_hz ) * ( Nfft / 2 )))) = ... ones( 1, (( WN1 / FSadc_hz ) * Nfft )); tmp_fft_buf = tmp_fft_buf .* tmp_msk_buf; PN1_smp_buf = ifft( fftshift( tmp_fft_buf )); % Шум аналоговой части АЦП PN2 = db2pow( PNadc_snr_dbw ) - db2pow( PNadc_qan_dbw ); %PN2 = db2pow( PNadc_snr_dbw ); Pfull_bw = PN2; PN2_smp_buf = sqrt( 0.5 * Pfull_bw ) * complex( randn( 1, Nsmp ), randn( 1, Nsmp )); % Ограничитель и квантователь АЦП QAN_smp_buf = PS1_smp_buf + PS2_smp_buf + PN1_smp_buf + PN2_smp_buf; QAN_delta = Vadc_fs_v / ( 2 ^ NBadc_fs_bits ); QAN_smp_buf = round( QAN_smp_buf ./ QAN_delta ) .* QAN_delta; QAN_smp_buf_re = real( QAN_smp_buf ); QAN_smp_buf_re( find( QAN_smp_buf_re > ( Vadc_fs_v / 2.0 ))) = Vadc_fs_v / 2.0; QAN_smp_buf_re( find( QAN_smp_buf_re < ( -Vadc_fs_v / 2.0 ))) = -Vadc_fs_v / 2.0; QAN_smp_buf_im = imag( QAN_smp_buf ); QAN_smp_buf_im( find( QAN_smp_buf_im > ( Vadc_fs_v / 2.0 ))) = Vadc_fs_v / 2.0; QAN_smp_buf_im( find( QAN_smp_buf_im < ( -Vadc_fs_v / 2.0 ))) = -Vadc_fs_v / 2.0; QAN_smp_buf = complex( QAN_smp_buf_re, QAN_smp_buf_im ); % Спектр после ADC tmp_smp_buf = QAN_smp_buf; %tmp_smp_buf = PS1_smp_buf + PS2_smp_buf + PN1_smp_buf + PN2_smp_buf; tmp_fft_buf = fft( tmp_smp_buf ) / Nfft; tmp_acc_buf = tmp_acc_buf + ( tmp_fft_buf .* conj( tmp_fft_buf )); end tmp_acc_buf = tmp_acc_buf ./ max_acc; f = linspace(( -FSadc_hz / 2 ) + BWfm_min_hz, FSadc_hz / 2, Nfft ); plot( f, pow2db( fftshift( tmp_acc_buf ))); xlim( [( -FSadc_hz / 2 ), ( FSadc_hz / 2 )] ); ylim( [-150.0, -20.0] ); title('Power Spectrum') xlabel('Frequency (Hz)') ylabel('P(f) dBW') drawnow;
К сожалению, картинку пока вставить не смог (нет под рукой подходящего хостинга), поэтому ссылка на Яндекс-диск.
Что ж, модель показала жизнеспособность идеи — чувствительность -115дБм, блокровка под 90дБ.
Далее, в ПЛИС, с помощью блока нормализации сигналов квадратур, мы уберем постоянную составляющую, справимся с зеркальным каналом и подадим сигнал на вход DDC. После сноса интересующей частоты в ноль, сигнал попадет на цепочку цифровых CIC — и FIR-фильтров, формирующих канальную полосу. Разумеется, если мы хотим одновременно принимать не один канал, у нас должна быть кучка DDC и фильтров.
В следующей статье, если публике будет интересно, расскажу о дальнейших шагах в моделировании, и оценке аппаратных ресурсов ПЛИС.
ИИ находит вдвое больше программных уязвимостей, но хакеры их почти не используют
Rocket Lab открыла четвёртый космодром на Аляске для расширения сети запусков
Китайские астрономы открыли уникальный пульсар с аномальным замедлением и нулевым гамма-излучением
Раскрыты характеристики глобальной версии Redmi Note 17 Pro Max: батарея 9210 мА·ч, зарядка 100 Вт, защита IP69K и чип Snapdragon 6 Gen 5
Запущен первый спутниковый флот для обнаружения лесных пожаров на ранней стадии
Россия открывает доступ к квантовому процессору SnowDrop 8Q на 8 кубитов
Смартфон Samsung Galaxy A37 перевели на квартальные обновления спустя всего четыре месяца после релиза
Кабмин увеличит финансирование достройки первых серийных Ил-114-300