2
4. Порядок выполнения и приемки работы
4.1 Работа должна быть представлена на защиту в электронной форме и
на бумажном носителе.
3
РЕФЕРАТ
Введение 3
3 Результаты расчетов 70
Заключение 92
3
Цель данной работы – изучение и программная реализация алгоритма
фокусировки радиолокационного изображения, получаемого с космических
РСА.
Задачи работы:
5
1 Описание алгоритма фокусировки радиолокационного изображения
радиолокатора с синтезированной апертурой.
6
записываются отдельно и в определенном порядке, зависящем от типа
поляризации изображения.
3) Trailer File – используется для записи данных о контроле качества и
другой информации, недоступной в начале обработки, например,
гистограммы предыдущего изображения
4) Также существует несколько дополнительных файлов, определяющих
характеристики организации данных. Эти файлы необходимы только
для определения конфигурации представления данных и не требуются
при обработке.
8
Результатом распаковки является оригинальное несфокусированное
изображение подстилающей поверхности, амплитудная составляющая
которого представлена на рисунке 1.2.
𝑡 𝐾 𝑡 (3)
𝑠𝑛 (𝑡) = exp(𝑗𝜓) 𝑟𝑒𝑐𝑡 ( ) = exp (𝑗 2𝜋 [𝑓𝑐 𝑡 + 𝑡 2 ]) 𝑟𝑒𝑐𝑡 ( ),
τ𝑝 2 𝛕𝒑
11
Частота ЛЧМ сигнала изменяется по закону
1 𝑑𝜓 τ𝑝 τ𝑝 (4)
𝑓= = 𝑓𝑐 + 𝐾𝑡, − ≤ 𝑡 ≤ +
2𝜋 𝑑𝑡 2 2
Ширину полосы ЛЧМ сигнала можно определить с помощью
минимального и максимального значений частоты:
𝐾τ𝑝 (5)
𝑓𝐵𝑊 = (𝑓𝑐 + 𝐾τ𝑝 /2) − (𝑓𝑐 − ) = |𝐾|τ𝑝 .
2
Для упрощения процесса обработки предположим, что наклонная
дальность между радаром и точечным источником постоянна для выбранного
импульса, хотя для разных импульсов она разная. Это называется
аппроксимацией «вперед-назад», и она позволяет разбить двумерный процесс
фокусировки на два одномерных, проводимых в частотной области, как будет
показано ниже. Соответственно, задержка времени τ между излучением
сигнала и его возвращением с точки поверхности, находящейся на расстоянии
𝜌 можно записать в виде [3]:
ρ(s) (6)
τ(s) = 2 ,
c
где s – «медленное» время. Следовательно, отклик 𝑟(𝑠, 𝑡) можно записать как
𝐾 𝑡−𝜏 (7)
𝑟(𝑠, 𝑡) = 𝑠𝑛 (𝑡 − τ) = exp {𝑗 2𝜋 [𝑓𝑐 (𝑡 − 𝜏) + (𝑡 − 𝜏)2 ]} 𝑟𝑒𝑐𝑡 [ ].
2 τ𝑝
𝑡 − 𝜏(𝑠) (8)
𝑟(𝑠, 𝑡) = exp(−j 4𝜋ρ(s)/λ)exp{𝑗𝜋𝐾[(𝑡 − 𝜏(𝑠))2 ]} 𝑟𝑒𝑐𝑡 [ ],
𝛕𝒑
13
Это приводит к ограничению снизу отношения сигнал-шум в момент
времени 𝑡 = 𝜏. Так как согласованный фильтр – это LTI-система, он может
быть описан через импульсный отклик:
𝑉𝑟2 2 (12)
𝑅(𝜂) = √𝑅02 + 𝑉𝑟2 𝜂2 ≈ 𝑅0 + 𝜂 ,
2𝑅0
где 𝑅0 - значение дальности точки, ближайшей к антенне (то есть в
центре синтеза апертуры), 𝑉𝑟 – скорость спутника.
𝑅0 𝑓0 𝑉𝑟2 𝑓0 2 (13)
𝑆𝑎 (𝜂) = 𝐴′ 𝑤𝑎 (𝜂 − 𝜂𝑎 ) exp {−𝑗 4𝜋 } exp {−𝑗 2𝜋 𝜂 }.
𝑐 𝑐𝑅0
14
Отсюда можно выразить фазу сигнала:
𝑅0 𝑓0 𝑉𝑟2 𝑓0 2 (14)
𝜑(𝜂) = −𝑗 4𝜋 − 𝑗 2𝜋 𝜂 .
𝑐 𝑐𝑅0
Частота сигнала в направлении азимута - это производная фазы по времени:
𝑉𝑟2 𝑓0 (17)
𝑓𝑑𝑐 = 𝑓𝑎 (𝜂с ) = − 𝜂,
𝑐𝑅0 с
где ηс – момент времени, соответствующий центру диаграммы
направленности. Следовательно, частоту Доплера можно представить как
линейную функцию, зависящую от «медленного» времени:
𝑓𝑑 = 𝑓𝑑𝑐 + 𝐾𝑎 𝜂. (18)
Причина возникновения частотного сдвига в центре диаграммы
заключается в появлении угла скоса между направлением съемки и
перпендикуляром к траектории движения спутника [5]. В идеальном случае,
когда антенна направлена строго перпендикулярно траектории, доплеровский
центроид равен нулю, и сдвига спектра не происходит. Однако из-за
совокупности факторов (например, механических или электромагнитных)
направление антенны в плоскости наклонной дальности может измениться,
что приводит к смещению диаграммы направленности и спектра сигнала.
15
Рисунок 1.4. Возникновение угла скоса (squint angle) при съемке РСА
[5].
16
такой метод является малоэффективным, так как измерения высот пролета
спутника не обладают достаточной точностью. Поэтому для улучшения и
уточнения измерений необходимо использовать несфокусированные
изображения. Из-за того, что отсчеты азимутального сигнала принимаются с
конечной скоростью, полезно разбить доплеровский центроид на две
компоненты. Первая компонента ограничена 𝑃𝑅𝐹 и находится в пределах
[−𝑃𝑅𝐹/2, 𝑃𝑅𝐹/2]. Это связано с тем, что импульсы могут отсчитываться
только с определенной частотой (𝑃𝑅𝐹), и центроид возможно вычислить
только в пределах этой частоты. Однако возможны ситуации, когда реальный
доплеровский центроид находится за пределами 𝑃𝑅𝐹. В этом случае
существует дополнительная компонента, которая кратна 𝑃𝑅𝐹. Поэтому
доплеровский центроид разбивается на узкополосную часть (baseband DC) и
доплеровское число неопределенности (ambiguity number) [6]:
17
автокорреляционной функции азимутального сигнала. Допустим, что имеется
стохастический процесс 𝑠0 [𝑛], тогда автокорреляционная функция двух
отсчетов этого процесса, разделенных 𝑘 отсчетами, принимает вид
1 (26)
𝑓𝑓𝑟𝑎𝑐 = arg{𝑟ℎ (𝑘)} .
2𝜋𝑘𝑇
На практике данный алгоритм реализуется с параметром 𝑘 = 1. Стоит
отметить, что этот алгоритм вычисляет значение узкополосного центроида,
так как фаза автокорреляционной функции ограничена диапазоном [−𝜋, 𝜋].
18
Это означает, что с его помощью можно вычислить только дробное значение
доплеровского центроида. Для вычисления абсолютного значения требуются
некоторые усовершенствования алгоритма, которые реализованы, например, в
алгоритме MLCC.
4𝜋
𝑠1 (𝜂) = 𝑤𝑎 (𝜂 − 𝜂𝑐 ) exp {−𝑗 𝑓 𝑅(𝜂)},
𝑐 1
(28)
4𝜋
𝑠2 (𝜂) = 𝑤𝑎 (𝜂 − 𝜂𝑐 ) exp {−𝑗 𝑓 𝑅(𝜂)} .
𝑐 2
Наклонная дальность 𝑅(𝑛) определяется по формуле
𝑣2 2 (29)
𝑅(𝜂) = √𝑅02 + 𝑣 2 𝜂2 ≈ 𝑅0 + 𝜂 ,
2𝑅0
где 𝑅0 – минимальная наклонная дальность (соотнесенная к ближайшей
точке на поверхности), 𝑣 – эффективная скорость движения спутника
относительно цели. Игнорируя постоянные фазовые члены, выражения для
сигналов можно переписать в виде
𝑠1 (𝜂) = 𝑤𝑎 (𝜂 − 𝜂𝑐 ) exp{−𝑗𝜋𝐾𝑎1 𝜂2 },
𝑠2 (𝜂) = 𝑤𝑎 (𝜂 − 𝜂𝑐 ) exp{−𝑗𝜋𝐾𝑎2 𝜂2 }, (30)
где 𝐾𝑎1 , 𝐾𝑎2 - доплеровские скорости двух обзоров соответственно:
2𝑣 2 𝛥𝑓
𝐾𝑎1 = (𝑓0 − ),
𝑐𝑅0 2 (31)
19
2𝑣 2 𝛥𝑓
𝐾𝑎2 = (𝑓0 + ).
𝑐𝑅0 2
Следовательно, существует ненулевая разность между доплеровскими
скоростями обзоров
2𝑣 2 𝛥𝑓𝑟 𝛥𝑓𝑟 (32)
𝐾𝑎2 − 𝐾𝑎1 = = 𝐾𝑎0 ,
𝑐𝑅0 𝑓0
где 𝐾𝑎0 – доплеровская скорость для исходного обзора.
′
𝑃𝑅𝐹𝑓0 𝛥𝜑 (36)
𝑓𝐷𝐶 = − .
2𝜋𝛥𝑓
При этом, согласно алгоритму CDE и в обозначениях MLCC, дробная часть
доплеровского центроида равна
20
𝑃𝑅𝐹 𝜑1 + 𝜑2 (37)
𝑓𝑓𝑟𝑎𝑐 = − ( ).
2𝜋 2
Эти вычисления необходимы для точного определения числа
неопределенности и, соответственно, абсолютного значения доплеровского
центроида. Отдельно вычисление дробной части необходимо для уточнения
𝑀𝑎𝑚𝑏 [10]:
21
процедуры составляют общую процедуру свертки изображения. Она состоит
из двух основных процессов: свертки по дальности и свертки по азимуту (или
сжатий) [5]. Между этапами свертки проводятся дополнительные операции по
коррекции алгоритма фокусировки РЛИ и нивелированию искажений,
связанных с формой проведения съемки и априори присутствующим
шумовым фоном.
𝑡 (40)
ℎ𝑟 (𝑡) = exp(−𝑗𝜋𝐾𝑡 2 )𝑟𝑒𝑐𝑡 [ ].
𝜏𝑝
22
2𝜌(𝑠) 𝜌(𝑠) (42)
𝑔(𝑠, 𝑡) = 𝑓𝐵𝑊 𝑠𝑖𝑛𝑐 (𝜋𝑓𝐵𝑊 [𝑡 − ]) exp [−𝑗4𝜋 ],
𝑐 𝜆
где было использовано выражение для ширины полосы спектра
импульса, а 𝑠𝑖𝑛𝑐(𝑥) = sin(𝑥)/𝑥.
𝜌(𝑠) (43)
𝜓 = −4𝜋 .
𝜆
Отсюда можно выразить доплеровский центроид и доплеровскую
скорость
24
производные) и 𝑠𝑐 – момент времени, когда отражатель находится в центре
луча:
1 (46)
𝜌(𝑠) = 𝜌с + 𝜌̇ с (𝑠 − 𝑠𝑐 ) + 𝜌̈ с (𝑠 − 𝑠𝑐 )2 ,
2
где ряд Тейлора построен до второго порядка. Производные дальности можно
записать в виде
𝜌̇ (𝑠) = 𝜌̇ с + 𝜌̈ с (𝑠 − 𝑠𝑐 ), (47)
𝜌̈ (𝑠) = 𝜌̈ с . (48)
Используя уравнения, можно определить производные по дальности
через доплеровский центроид 𝑓𝐷𝐶 и доплеровскую скорость 𝑓𝑅 . Итоговое
выражение принимает вид
25
𝜆 1 (51)
𝜌(𝑠 − 𝑠𝑐 , 𝑠𝑐 , 𝜌с ) ≈ 𝜌(𝑠 − 𝑠𝑐 , 𝜌с ) ≡ ̃𝜌(𝑠, 𝜌с ) = = 𝜌с − (𝑓𝐷𝐶 𝑠 + 𝑓𝑅 𝑠 2 ) .
2 2
Здесь произведена замена 𝑠 − 𝑠𝑐 → 𝑠.
4𝜋 (52)
𝛹(𝑠, 𝜌с ) = − ̃𝜌(𝑠, 𝜌с ) − 2𝜋𝑓𝑠,
𝜆
где 𝑓 – частота Доплера. Метод стационарной фазы заключается в следующем
выражении:
𝑓 − 𝑓𝐷𝐶 (54)
𝑠̂ = .
𝑓𝑅
Подставляя это выражение в уравнение (1.51), дальность, связанная с точками
стационарной фазы будет равна
𝜆 2 ). (55)
̃𝜌(𝑠̂ , 𝜌с ) = 𝜌с − (𝑓 2 − 𝑓𝐷𝐶
4𝑓𝑅
Стоит отметить, что сжатый по дальности отклик цели распределен
между несколькими смежными отсчетами по дальности (как точечный
источник, изображенный с течением «медленного» времени). Коррекция
миграции по дальности – это процедура, посредством которой дальность,
соотнесенная с откликом цели скорректирована постоянным значением
дальности 𝜌с в центре луча.
26
дальности сигнала. Для малых смещений по дальности интерполяцию можно
полностью провести в частотной области. С другой стороны, большие
смещения по дальности усложняют процедуру. Для их нивелирования
требуются дополнительная процедура так называемого азимутального сжатия
по дальности или второго сжатия по дальности.
27
Рисунок 1.6 - Коррекция миграции по дальности. На рисунке слева
изображена параболическая линия по азимуту, справа – выпрямленная
вследствие корректировки.
1 𝑠 (57)
ℎ𝑎 (𝑠) = exp [𝑗2𝜋 (𝑓𝐷𝐶 𝑠 − 𝑓𝑅 𝑠 2 )] rect [ ] ,
2 𝜏𝑎
где 𝜏𝑎 = 𝜆𝜌с /2𝑉𝑠𝑡 𝛿𝑎, 𝛿𝑎 ≥ 𝐿𝑎 /2.Время 𝑠 измеряется относительно 𝑠𝑐 , 𝑉𝑠𝑡 –
скорость спутника относительно цели, 𝐿𝑎 – длина антенны в направлении
азимута, 𝛿𝑎– требуемое разрешение по азимуту (теоретический нижний порог
- 𝐿𝑎 /2). Здесь разрешение используется как входной параметр, изменение
которого повлечет за собой изменение времени синтеза [11].
28
где 𝐵𝐷 = |𝑓𝑅 |𝜏𝑎 – ширина полосы доплеровских частот. Следовательно,
разрешение по азимуту 𝛿𝑎 можно записать как
𝑉𝑠𝑡 (59)
𝛿𝑎 = 𝑉𝑠𝑡 𝛿𝑠 = 𝑉𝑠𝑡 𝐵𝐷−1 = ,
|𝑓𝑅 |𝜏𝑎
где 𝛿𝑠 –это ширина лепестка диаграммы направленности выходного сигнала
азимутального фильтра на уровне половинной мощности. Из этого выражения
видно, что лучшее разрешение по азимуту можно получить, увеличивая время
синтеза апертуры. Например, при режиме точечной съемки (Spotlight-mode
SAR) луч радара направляется на фиксированную область поверхности на
протяжении всей съемки. При этом увеличивается время синтеза (для
небольшого участка поверхности), следовательно, растет интервал синтеза
апертуры и ширина полосы частот. Тем самым достигается уменьшение 𝛿𝑎 и
улучшение качества изображения в сравнении с полосовым режимом съемки
РСА (Stripmap-mode SAR). Однако подобное улучшение возможно только для
относительно небольших участков земной поверхности.
29
для сохранения однородности разрешения по азимуту на всем снимке
необходимо увеличивать число отсчетов по азимуту, используемых в сжатии
по дальности.
31
тому, что значение доплеровского центроида в данной области съемки
изменится. Подобные изменения могут серьезно повлиять на всю процедуру
обработки и, соответственно, качество выходного изображения. Это связано с
тем, что операция быстрой свертки проводится в частотной области, где из
спектра переданного сигнала исключается спектр входного (для получения
сигнала отраженной поверхности). Неправильное построение опорной
функции по азимуту без учета карты доплеровских смещений приведет к
множественным ошибкам в самой процедуре сжатия.
(б)
(в)
Рисунок 1.8. Графики зависимости доплеровского центроида от
дальности для: а-1000 линий по азимуту; б – 2000 линий по азимуту; в – 5000
линий по азимуту.
35
Рисунок 1.9. График зависимости доплеровского центроида от
дальности для всех линий по азимуту.
36
2 Программная реализация этапов алгоритма фокусировки
радиолокационного изображения.
37
строк, каждая из которых состоит из "шапки" и основных данных. В "шапке"
находятся различные параметры съемки: дата съемки, длительность импульса
радиосигнала, частота повторения импульса, тип поляризации, количество
отсчетов по дальности и номер строки по азимуту. Следует отметить, что при
подобном расположении данных "шапка" остается практически неизменной.
Однако это необходимо при дешифрировании данных типа ScanSAR. Дело в
том, что при этом режиме съемка проводится сразу с пяти лучей, обладающих
разными значениями PRF, а также количеством отсчетов по дальности. При
этом запись проводится в реальном времени по частям, то есть данные с
разных лучей записываются в зависимости от времени, а не расположения, и,
следовательно, разбиты. Именно для подобного формата записи необходимо в
каждой строке указывать все параметры, в том числе и неизменяемые.
mseek(16276, fd)
range_pixels=mget(1, 'uib', fd)
38
Число пикселей по азимуту можно определить, зная номера начальной и
конечной строк. Номер начальной строки определяется таким образом:
mseek(16264)
azimuth_1=mget(1, 'uib', fd)
info=fileinfo(fn)
raw_end=info(1)
i_number_azimuth=raw_end-20888
mseek(i_number_azimuth, fd)
azimuth_2=mget(1, 'uib', fd)
azimuth_pixels=azimuth_2-azimuth_1+1
mseek(16288, fd)
year=mget(1, 'uib', fd)
day=mget(1, 'uib', fd)
msec_begin=mget(1, 'uib', fd)
i_msec=raw_end-20856
mseek(i_msec)
msec_end=mget(1,'uib', fd)
slow_time=msec_end-msec_begin
39
Подобным образом определяются частота повторения импульсов PRF и
длительность импульса 𝜏𝑝 :
mseek(16308, fd)
PRF=mget(1, 'uib', fd)
taup=mget(1, 'uib', fd)
disp(taup)
path_par='/'+string(year)+'_'+string(day)+'_HH/'
mkdir(path_par)
savematfile(path_par+'parameters.mat', 'azimuth_pixels',
'range_pixels', , 'year', 'day', 'slow_time', 'PRF', 'taup', '-
v6')
41
Ниже описан алгоритм импорта квадратур для снимков с одиночной
поляризацией:
42
Для удобства использования программы заданы специальные условия,
определяющие поляризацию снимка и автоматически выбирающие формат
записи данных:
if T==0 then
if R==0 then
disp("Single polarisation")
…
end
if R==2 then
disp("Double polarisation')
…
end
43
Представленный здесь алгоритм импорта данных в формат .mat имеет
несколько существенных недостатков. Основной проблемой является
ресурсоемкость программного обеспечения и, соответственно, низкая
скорость выполнения операций. Разбиение на сегменты является
вынужденной мерой, так как объем памяти, используемый программной
средой Scilab, не может превышать 2,1 гигабайт. В то же время объемы
импортируемых данных с ALOS PALSAR составляют размер больше 5
гигабайт. Также стоит отметить сильное уменьшение скорости вычислений в
зависимости от роста размера массивов.
44
Дальнейшая обработка радиолокационных изображений проводится на
базе языка программирования Python. Следовательно, импортированные с
помощью Scilab данные необходимо импортировать в среду Python. Для этого
был построен модуль, состоящий из подпрограмм, которые оперируют с
данными в формате .mat.
import numpy as np
import matplotlib.pyplot as plt
import scipy.io as spio
def import_data(path):
import scipy.io as spio
data=spio.loadmat(path)
return data[‘HH’]
45
процедуры, описанной в разделе 1.1.2. Функция, выполняющее распаковку,
имеет вид:
def data_unpack(raw_data):
import numpy as np
return raw_data - np.mean(raw_data)
def prf(par_path):
data=spio.loadmat(par_path)
return int(data['PRF'])
def range_size(raw_data):
return raw_data.shape[1]
def azimuth_size(raw_data):
return raw_data.shape[0]
def taup(par_path):
data=spio.loadmat(par_path)
return int(data['taup'])
def slow_time_duration(par_path):
data=spio.loadmat(par_path)
return int(data['slow_time'])
46
Эта программа реализована таким образом, чтобы учитывать, является ли год
високосным.
def getting_names(folder_path)
import os
from os import listdir
return listdir(folder_path)
def getting_paths(folder_path):
import os
from os import listdir
names=listdir(folder_path)
paths=[]
for name in names:
paths.append(str(folder_path)+'/'+str(name))
return paths
47
Данная программа возвращает объединенный массив данных conc,
значения PRF pulse_freq, длительность съемки atime, длительность импульса
rtime и дату съемки. Файл “parameters.mat”, в котором содержатся параметры
съемки, из списка сегментов при объединении удаляется. При этом
долонительно проводится сортировка файлов, чтобы избежать неправильной
склейки
48
Также в разделе описывается программная реализация алгоритма
MLCC. Для применения этого алгоритма требуется изображение, сжатое по
дальности. Процедура сжатия по дальности находится в не рамок данной
работы, поэтому этот пункт представлен в виде некоторого предварительного
замечания к будущей работе.
49
собственно, автокорреляционная функция acf и шаг k. Подобный выбор
выходных данных требуется для дальнейшей обработки.
50
Данная программа возвращает массив значений доплеровского
центроида для каждого значения дальности. Входными данными является
двумерный массив сырых данных, значения 𝑃𝑅𝐹 и параметра k. Для начала
создается пустой список. Затем в виде цикла производятся последовательные
вычисления доплеровского центроида для каждого отсчета по дальности.
Полученные значения последовательно добавляются в массив данных. Такая
структура работы программы обеспечивает относительно слабое влияние на
ресурсы системы, так как список увеличивается постепенно, с каждой
итерацией цикла. После прохождения всех вычислений список сохраняется в
виде стандартного массива модуля NumPy. Это делается для удобства
интерпретации данных и сохранения однородности их представления.
51
Полученные массивы данных можно изобразить в виде графиков
зависимости от пикселей по дальности. Этот шаг реализован следующим
образом:
52
Если же конечное положение находится вне значения массива (случай
последнего окна), то оно становится равно номеру последнего отсчета. Внутри
окна производится операция усреднения значений. Полученные средние
добавляются к изначально пустому списку dc_win, аналогично функции
centroid_all_lines. Итоговый список возвращают как массив формата NumPy
вместе с координатами центров окон range_pixel_samples, которые
понадобятся в дальнейшем.
53
Данная функция требует таких исходных данных, как сырое
изображение raw_data, частота повторения импульсов prf, размер окна по
азимуту wa, размер окна по дальности wr, шаг окна по азимуту sa, шаг окна по
дальности sr. Цикл реализован так, что сначала определяется положение окна
по азимуту способом, описанным для функции doppler_range_map. Затем в
этом окне проводятся вычисления доплеровского центроида для всех отсчетов
по дальности, а также «оконный» массив по дальности. Эти значения
сохраняются в большом списке doppler_map, который в качестве своих
элементов содержит списки, составленные из вычислений центроида в
отдельных окнах по азимуту. Таким образом, после прохождения всего цикла
получается массив, содержащий детальную двумерную карту доплеровских
смещений. При этом функцией возвращается целый набор данных: список,
состоящий из списков координат центров окон, карта смещений со всеми
значениями центроида по дальности в формате NumPy и ее усредненная
версия.
def image(doppler_map):
fig = plt.figure()
ax6 = fig.add_subplot(1,1,1)
ax6.imshow(doppler_map, aspect='equal', vmax=250)
ax6.set_title('Doppler map')
ax6.set_xlabel('Range pixels')
ax6.set_ylabel('Azimuth pixels')
ax6.set_xticks([])
54
ax6.set_yticks([])
return True
55
соответствующие разным частям спектра. Для этого реализована функция
range_look:
56
Она сравнительно похожа на аналогичную подпрограмму из
предыдущего раздела с тем лишь исключением, что здесь не задается параметр
k, то есть функция всегда считается с шагом k=1.
57
сдвига частот delta_f, равное fs – частоте отсчетов. Подобный выбор позволяет
использовать в качестве обзоров верхнюю и нижнюю половины спектра.
59
Здесь происходит несколько последовательных вычислений карт
Доплера для набора снимков с размерами окон 4096 и 1024, 256 и 64, 64 и 64,
32 и 8. При этом не возникает проблем с памятью, так как после каждого
вычисления происходит ее очистка.
62
[Фрагмент программного кода]
63
2) Определение параметров окон, по которым будет проводиться
масштабирование: sr – окно по дальности, sa – по азимуту
3) Масштабирование изображения: в основе лежит двойной цикл,
присваивающий выходному массиву данных значения исходной карты
Доплера, линейно «растянутые» по массиву. Линейность растяжения
связана с тем, что положения окон равномерно распределены по снимку.
64
Результаты тестирования показали, что первая подпрограмма
масштабирует изображения быстрее второй. Это представляется вполне
логичным ввиду того, что в первой программе используется один двойной
цикл вместо двух во второй.
def range_reference(range_chirp):
return
np.conjugate(np.fft.fftshift(np.fft.fft(range_chirp)))
66
Здесь ta – время синтеза апертуры, V – эффективная скорость движения
спутника, R_0 – минимальная наклонная дальность (в центре орбиты), lambda
– длина несущей волны.
67
3) Полученный спектр перемножается со спектром соответствующей
дальностной строки, после этого проводится обратное
преобразование Фурье.
4) Выбирается следующая итерация и следующая строка по дальности.
68
Схема 2.1 – Структура программ, реализующих этапы обработки
радиолокационных изображений.
Импорт данных
Импорт сегментов изображения и параметров
съемки, сохранение в формате .mat (Scilab)
Импорт в Python файлов с сегментами
изображения и файла с параметрами:
prf, range_size, azimuth_size, taup, date, slow_time_duration,
import_data, data_unpack
Объединение сегментов:
getting_names, getting_paths, concatenate
69
3 Результаты расчетов
70
Рисунок 3.2 - Пример записи квадратур в сыром файле
71
Структура mat-файлов представлена на рисунках ниже. Рисунок 3.4
изображает mat-файл, соответствующий некоторому сегменту изображения.
Как видно, массивы данных с разной поляризацией записываются в разные
матрицы с соответствующими названиями - «HH» или «HV». Структура
самих матриц представлена на рисунке 3.5. Здесь квадратуры еще не
распакованы и, следовательно, представлены в виде массива целых чисел.
72
Рисунок 3.6 - Структура файла «parameters.mat»
75
Рисунок 3.9. 3d-график карты доплеровских смещений, полученный
для снимка от 15 января 2007 года, сделанного в районе Заполярья
76
Как было показано в пункте 2.2.3, подобный формат записи не
представляет реальную картину, но его можно применить для
предварительной демонстрации и сравнения данных с амплитудным
изображением.
77
После экспорта масштабированных карт Доплера в QGIS можно
рассмотреть их вместе с амплитудными изображениями, полученными с
помощью программы SARscape. Для большей наглядности карта
накладывается на амплитуду. На рисунках 3.12 и 3.13 представлены карты
доплеровских смещений вместе с соответствующими амплитудными
изображениями, наложенные друг на друга. Эти изображения соответствуют
серии снимков, сделанных в районе Карских ворот 11 апреля 2011 года.
78
Рисунок 3.10 - Сегменты карт доплеровских смещений, полученных с
разным размером плавающего окна: а – 4096*1024, б - 256*64, в – 64*64, г –
32*8 пикселей.
79
Рисунок 3.11 – Сегменты карт доплеровских смещений с аналогичными
размерами окон для другой области.
80
Рисунок 3.12 - Снимки, сделанные 11 апреля 2011 года в районе
Карских ворот: а – первый, б - второй
81
Рисунок 3.13 - Снимки, сделанные 11 апреля 2011 года в районе
Карских ворот: а – третий, б – четвертый.
82
Рисунок 3.14 - Смежные сегменты карт смещений для двух
последовательных снимков: а- первого, б - второго
83
с движением водных масс и, следовательно, нестабильной топографией
берегов рек.
84
это подтверждается сравнением исходных масштабированных карт Доплера с
исходными изображениями. Как видно, и здесь общая структура карт
сохраняется от снимка к снимку. Стоит отметить, что экспорт данных в
SARscape позволяет получить исходные массивы данных без какого-либо их
квантования. Теперь можно провести более детальный анализ полученных
карт. На его основании можно заметить, что в зависимости от времени съемки
значения доплеровских частот смещаются в положительную либо
отрицательную область. При этом локальные перепады частот становятся
более резкими.
86
Ниже представлены изображения с наложенными на цифровую модель
рельефа картами смещений частоты Доплера, полученными с тех же ракурсов
и расположенные в том же порядке.
88
Рисунок 3.21. Наложенные друг на друга карты доплеровских
смещений с первого и второго ракурсов: а – 15.01.2007 и 18.05.2008; б –
02.03.2007 и 18.05.2008
91
ЗАКЛЮЧЕНИЕ
92
Был разработан алгоритм построения детальных карт доплеровских
смещений. Он основан на методе плавающего окна, реализация которого
является оригинальным результатом данной работы. Набор подпрограмм,
необходимых для построения карты, решает следующие задачи: вычисление
доплеровского центроида с помощью двух методов - CDE и MLCC,
построение двумерной карты смещений на основе описанных методов,
сохранение и масштабирование данных для последующего экспорта в
стороннее программное обеспечение. Подобные процедуры необходимы для
последующего сравнения полученных результатов с радиолокационными
изображениями, полученными с помощью ENVI SARscape.
93
несфокусированных изображений и как дополнительный инструмент анализа
данных дистанционного зондирования.
94
СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ
95
Приложение А Листинг программы импорта на базе ПО Scilab
stacksize('max')
clear
azsize=2000
name='PASL10C0807051439060908070035'
path='/media/iomega_nas_3/SAR_Focusing/raw/chayanda/DPRP20090805
0045_01'
fn = path+'/'+string(name)+'/'+ string(name)+'.raw'
fd=mopen(fn, 'rb')
96
97
98
99
Приложение Б Листинг модуля import_rawdata_mat
"""
"""
def import_data(path):
"""Import raw I/Q image from .mat file "as is".
Data is unpacked from original CEOS format file by Scilab.
DC biases has been already calculated."""
data=spio.loadmat(path)
return data['HH']
def import_raw_data(path):
data=spio.loadmat(path)
if data['HH'] and data['HV']:
return {'HH':data['HH'], 'HV': data['HV']}
if data['HH']:
return {'HH': data['HH']}
def getting_paths(folder_path):
"""
Program forms list with paths of files containing SAR image.
"""
names=listdir(folder_path)
paths=[]
for name in names:
100
paths.append(str(folder_path)+'/'+str(name))
return paths
101
102
103
Приложение В Листинг модуля doppler_centroid_cde.
"""
"""
import math
import import_rawdata_mat as raw
import numpy as np
import matplotlib.pyplot as plt
import scipy.io as spio
104
105
106
107
108
Приложение Г Скрипт программы
#%%
import import_rawdata_mat as raw
import doppler_centroid_cde as cde
import scipy.io as spio
#raw_data=0
#samples, doppler_map, doppler_map_win=0, 0, 0
#raw_data, prf, aperture_time, taup, date =
raw.concatenate('/media/iomega_nas_3/SAR_Focusing/scilab_import/
zapolyarie/2009_218_HH_packed_2')
109
#%%
import doppler_centroid_az_psd as dcpsd
#%%
import doppler_centroid_cde as cde
import scipy.io as spio
import numpy as np
#raw_data, prf, aperture_time, taup, date =
raw.concatenate('/media/iomega_nas_3/SAR_Focusing/scilab_import/
new/2007_195_62250682_HH_HV_packed')
#dcen_cde=cde.centroid_all_lines(raw_data, 1, prf)
dc_win_cde=cde.centroid_window(dcen_cde, raw_data.shape[1], 10)
cde.plotting(dcen_cde, dcen_cde.shape[0], "DC using CDE, "+
str(raw_data.shape[0]) + " azimuth samples", "range pixels",
"Frequency")
cde.plotting(dc_win_cde, dc_win_cde.shape[0], "DC windowed using
CDE, " + str(raw_data.shape[0]) + " azimuth samples", "range
pixels", "Frequency")
'''samples, doppler_map,
doppler_map_win=cde.doppler_map(raw_data, prf, 64, 64, 8, 8)
spio.savemat('/media/iomega_nas_3/SAR_Focusing/doppler_map/64_64
_8_8/karsk/doppler_map_'+str(date)+'_64_64_8_8',
{'azimuth_samples':np.asarray(samples[0]),
'range_samples':np.asarray(samples[1]), 'prf':prf,
'range_pixels':raw_data.shape[1],
'azimuth_pixels':raw_data.shape[0], 'taup':taup,
'doppler_map':doppler_map, 'doppler_map_win':doppler_map_win,
'date': date, 'azimuth_time':aperture_time}, True, '5')
cde.image(doppler_map_win)
'''
#%%
import scipy.io as spio
import doppler_centroid_cde as cde
data =
spio.loadmat('/media/iomega_nas_3/SAR_Focusing/doppler_map/64_64
_8_8/ber/doppler_map_2007_06_19_64_64_8_8.mat')
#%%
110
range_pwr=9440
res=cde.cut_as_pwr(res, res.shape[0], range_pwr)
res1=np.zeros((res.shape[0],res.shape[1]))
for i in range(1300,res.shape[0]):
for j in range(250,res.shape[1]):
import scipy.misc
cde.save_csv(res, path, 'test3')
#%%
import doppler_centroid_cde as cde
import scipy.misc
import os
path ='/64_64_8_8/mat'
map_paths=raw.getting_paths(path)
map_names=raw.getting_names(path)
print map_names
try:
os.mkdir(path[:-4]+'/csv')
os.mkdir(path[:-4]+'/tiff')
except OSError:
pass
for i in range(len(map_paths)):
res=0
doppler_map=0
res=cde.resize(map_paths[i])
if res.shape[1]==5152:
range_pwr=4720
if res.shape[1]==10304:
range_pwr=9440
res=cde.cut_as_pwr(res, res.shape[0], range_pwr)
data=spio.loadmat(map_paths[i])
doppler_map=data['doppler_map_win']
name=str((map_names[i])[:-4])+ '_'+str(doppler_map.shape[0])
+'_'+str(doppler_map.shape[1])+'_rev'
print 'Saving '+ name +'.tiff'
scipy.misc.toimage(res, cmin = -300.0, cmax =
300.0).save((path[:-4] +'/tiff/'+name+'.tiff'))
print 'Writing ' + name +'.csv'
cde.save_csv(doppler_map, path[:-4]+'/csv', name)
print ' '
map_paths=raw.getting_paths('/media/iomega_nas_3/SAR_focusing/do
ppler_map')
map_names=raw.getting_names('/media/iomega_nas_3/SAR_focusing/do
ppler_map')
for i in range(len(map_paths)):
data=spio.loadmat(map_paths[i])
111
doppler_map=data['doppler_map_win']
cde.image(doppler_map)
plt.savefig('/media/iomega_nas_3/SAR_focusing/images/'+str(map_n
ames[i])+'.svg', format='svg', dpi=300)
#%%
import import_rawdata_mat as raw
import doppler_centroid_cde as cde
import scipy.io as spio
paths_dir=raw.getting_paths('/SAR_focusing/scilab_import')
for path in paths_dir:
raw_data, prf, aperture_time, taup, date =
raw.concatenate(path)
samples, doppler_map,
doppler_map_win=cde.doppler_map(raw_data, prf, 64, 64, 8, 8)
spio.savemat('/media/iomega_nas_3/SAR_focusing/doppler_map/
64_64_8_8/doppler_map_'+str(date)+'_64_64_8_8_1',
{'azimuth_samples':np.asarray(samples[0]),
'range_samples':np.asarray(samples[1]), 'prf':prf,
'range_pixels':raw_data.shape[1],
'azimuth_pixels':raw_data.shape[0], 'taup':taup,
'doppler_map':doppler_map, 'doppler_map_win':doppler_map_win,
'date': date, 'azimuth_time':aperture_time}, True, '5')
paths_dir=raw.getting_paths('SAR_focusing/scilab_import')
print paths_dir
for path in paths_dir:
raw_data=0
samples, doppler_map, doppler_map_win=0, 0, 0
raw_data, prf, aperture_time, taup, date =
raw.concatenate(path)
samples, doppler_map, doppler_map_win =
cde.doppler_map(raw_data, prf, 32, 8, 4, 1)
spio.savemat('/32_8_4_1/doppler_map_'+str(date)+
'_32_8_4_1', {'azimuth_samples':np.asarray(samples[0]),
'range_samples':np.asarray(samples[1]), 'prf':prf,
'range_pixels':raw_data.shape[1],
'azimuth_pixels':raw_data.shape[0], 'taup':taup,
'doppler_map':doppler_map, 'doppler_map_win':doppler_map_win,
'date': date, 'azimuth_time':aperture_time}, True, '5')
112