Симулятор анализатора спектра FSP-30

В последние 3 года произошел рост цен на измерительное оборудование. В частности, анализаторы спектра фирмы Rohde & Schwarz стали практически недоступны. С другой стороны, они заменяются китайскими аналогами, что тоже очень неплохо.
При этом, анализаторы спектра данной фирмы широко были распространены из-за их адекватной работы.

По факту данное оборудование еще активно используется, но тратить его ресурс на обучение работе на нем студентов не совсем целесообразно. Для решения данной проблемы разработан симулятор анализатора спектра Rohde & Schwarz FSP-30.

Наиболее очевидным напрашивается подход на основе MATLAB или LabVIEW, но вместо манипуляций с интерфейсом FSP-30 будет интерфейс MATLAB или LabVIEW. Кроме этого лицензии на данное программное обеспечение очень дорогие, что затрудняет его официальное использование. Поэтому был выбран свой путь — разработка симулятора на моем любимом Delphi.

Интерфейс разработанного симулятора

Интерфейс разработанного симулятора

Решаемую задачу можно сформулировать следующим образом:

разработать симулятор анализатора спектра с диапазоном частот до 30 ГГц, повторяющий интерфейс Rohde & Schwarz FSP-30, обладающий адекватным визуальным отображением в зависимости от изменений параметров, позволяющим сформировать задания в виде набора сигналов и оценить правильность их измерения.

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

Ладно, подальше от лирики, поближе к коду…

Что мы будем измерять…

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

Для простоты идентификации сигналов имеется возможность их включения и выключения…отдельными кнопками (ТЕСТ 1 — ТЕСТ 5).

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

Сначала планировалось решать задачу в лоб — честно построить все сигналы, вычислить спектры и вывести нужный кусок спектра, но это оказалось невозможно. Современный ПЭВМ с 8 ГБ оперативки отказывался просчитывать спектр сигнала до 30 ГГц с требуемым разрешением. Поэтому, пришлось все упростить… Построен только один АМн сигнал, получен его спектр, а дальше идет его отображение с заданными параметрами в нужном месте спектра.

     T1:=4;   
     T2:=round(span*2/Sign[i,3,triger[i]]);
     if T2<1 then T2:=2048;

     // Формирование сигнала
     for ij:=0 to DFT.nmax do
      if ((ij mod T1)<(T1/2)) and ((ij mod T2)<(T2/2))
      then
       DFT.fdata[ij]:=0
      else
       DFT.fdata[ij]:=500;

где T1 и T2 — это два периода АМн сигнала (несущего и модулирующего), при этом T2 берется из массива исходных данных сигналов Sign с учетом значения span (ширина полосы обзора). В строках 6–11 происходит классическое построение дискретного АМн сигнала.

f_z:=Sign[i,1,triger[i]]; // Частота в МГц
   N_garm:=round(f_stop/f_z);//расчитали число гармоник
   for grm:=1 to min(N_garm,Sign[i,4,1]) do
    begin
     f_i:=f_z*grm;
     k_z:=round((f_i-f_start)*1024/(f_stop-f_start)); // номер гармоники
     j0:=512-k_z;
     j:=0;
     //Формирование общего спектра сигнала
     for k:=0 to DFT.kmax-1 do
      begin
       k1:=round(j0+j);
       if (k1>300) and (k1<724) and (f_i>f_start) then
          Spectr_sign[k]:=Spectr_sign[k]+round(Angle(i)*(Sign[i,2,triger[i]]*Spectr[k1]*abs(sin(grm*pi/2)/(grm*pi/2))/10));
       j:=j+1;
      end;
    end;
 end;  

f_z — частота узкополосного сигнала (значение берем из массива заданий); N_garm — число гармоник (надо учесть если в полосу обзора попадет несколько гармоник сигнала).

В строках 10–16 происходит добавление отображения сигнала в общем спектре в зависимости от его частоты и установленной полосы обзора.

При этом сигнал формируется только при изменении настроек симулятора один раз. А шум надо генерить постоянно.

 Randomize;
  //Получение спектра шума
 for k:=0 to DFT.kmax-1 do begin
  Spectr_sum[k]:=Max(Spectr_sign[k],0.1*random(rbw*Amp));
 end;

На данный момент шум представляет собой рандомное число, значение которого зависит от rbw (значение полосы пропускания).

Из функций анализатора доступны: выбор детектора, изменение частотного диапазона, выбор полосы пропускания, задание режима отображения (average, maxhold, clearwrite), выбор линейной или логарифмической шкалы отображения амплитуды, работа с маркером.

Реализация данного подхода позволила оживить «картинку спектра» при минимальной загрузке ЦП (у меня получается не более 3%). Вариантов применения данного симулятора очень много. При этом можно придумать различные сценарии… В момент добавления измеренного сигнала в отчет производится фиксация амплитуды маркера, частоты маркера, детектора и любых других параметров и настроек симулятора в зависимости от цели использования.

© Habrahabr.ru