Обеспечение согласованности шума в вашем сейсмографе!

Что такое сканирование AGC?

Сканирование AGC (Automatic Gain Controller) — это тип сканирования, при котором все выборки в трассе пытаются привести к нормализованному уровню. При обработке сейсмических данных этот тип сканирования можно использовать для того, чтобы сделать ваши трассы более читаемыми, опуская громкие выборки (точки на трассе с высокой амплитудой) на более низкий уровень, а тихие выборки (точки на трассе с низкой амплитуды) до более высокого уровня.

Как это может быть сделано?

Многие нефтегазовые компании нанимают сотрудников ГИС (географических информационных систем) для разработки программ, которые могут манипулировать результатами сейсмографа, чтобы извлекать полезную информацию из своих графиков. Многие из этих программ созданы с использованием языка программирования C, поэтому в этом посте мы рассмотрим, как выполнять сканирование AGC с использованием C.

Сканирование AGC выполняется путем создания «окна» вокруг выборки на трассе (диапазон выборок слева и справа от текущей выборки), а затем деления текущей выборки на среднюю амплитуду выборок в окне. Этот процесс выполняется для каждой выборки в трассе, делая большие значения меньше, а маленькие значения больше.

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

Настраивать

  • Для начала создайте новую папку под названием «AGC» и поместите ее в удобное место на своем компьютере.
  • Внутри этой папки создайте новый файл с именем «agc.c».
  • Откройте файл, используя выбранный вами текстовый редактор. Здесь будет находиться ваш код.
  • Получите текстовый файл, содержащий трассировку. Этот файл должен иметь четыре столбца (в порядке слева направо): Время(мс), Номер образца, Формат графика (необязательно для графика GNU) и Амплитуда.

  • Поместите этот текстовый файл в созданную вами папку AGC.

Файл трассировки, для которого мы будем выполнять сканирование AGC, до сканирования выглядит следующим образом:

Кодировка «agc.c»

Определить заголовки

В этом примере мы будем использовать четыре разных файла заголовков, встроенных в GCC (коллекцию компиляторов Gnu). Эти заголовки:

  • ‹stdio.h› — определяет три типа переменных, несколько макросов и различные функции для выполнения ввода и вывода.
  • ‹stdlib.h› — определяет четыре типа переменных, несколько макросов и различные функции для выполнения общих функций.
  • ‹string.h› — определяет один тип переменной, один макрос и различные функции для работы с массивами символов.
  • ‹math.h› — определяет различные математические функции и один макрос.

Мы указываем, что хотим использовать эти заголовки, используя #include ‹header› в самом верху файла.

Функции прототипа

В программах на C принято создавать прототипы любых функций в вашей программе в начале вашего кода. Прототип — это полное объявление функции, включающее тип возвращаемого значения и тип аргументов, которые функция получит.

В нашей программе мы будем прототипировать три разные функции. Одна функция для загрузки файла трассировки (loadTrace), одна функция для выполнения сканирования AGC (agcTrace), и одна функция для сохранения новой трассировки после сканирования AGC (saveTrace).

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

Параметры с префиксом «**» указывают на то, что они являются указателями на указатели. Указатель на указатель используется, когда вы передаете указатель другой функции, чтобы им можно было манипулировать. В нашей программе мы передаем указатели в функцию loadTrace, поэтому нам нужно предоставить указатель на эти указатели, чтобы реально манипулировать этими переменными. То же самое для функции agcTrace. Обратите внимание, что saveTrace принимает только один указатель. Это связано с тем, что мы передаем в функцию фактические значения (int и float), поэтому простого указателя на эти данные будет достаточно.

Основная функция

Функция main — это первая функция, которая запускается после запуска программы. В нашей mainфункции мы собираемся объявить переменные столбца. Нам потребуются три указателя на ячейки памяти, которые могут содержать значения int, по одному для столбцов 1, 2 и 3 и один указатель на ячейку памяти для хранения значения трассировки (или столбца 4) в виде числа с плавающей запятой. Мы можем объявить их так:

Теперь давайте вызовем функции, которые мы создали с помощью прототипов. В том порядке, как они должны называться:

  • loadTrace(&col1, &col2, &col3, &trace) — сохраняет все данные файла в переменные столбца и переменную трассировки.
  • agcTrace(&trace) — выполнение сканирования AGC трассировки, загруженной в систему.
  • saveTrace(col1, col2, col3, trace) — сохраните новую трассировку в файл.

Теперь функция main должна выглядеть примерно так:

loadTrace

Функция loadTrace используется для загрузки файла трассировки в программу. Поскольку loadTrace не возвращает никаких данных после завершения, мы объявляем эту функцию как возвращающую void:

Поскольку мы загружаем трассировку из отдельного файла, нам нужно объявить указатель на файловую структуру, чтобы мы могли читать информацию из указанных файлов. Это можно сделать с помощью типа данных FILE:

Далее нам нужно указать, какой файл мы хотим прочитать. Для этого мы создадим char[] для хранения имени файла с именем infile и будем писать в него с помощью strcpy функция:

Затем нам нужно выделить память для четырех столбцов, которые мы считываем из файла (col1, col2, col3 и trace), используя calloc:

В этом случае мы выделяем 1500 ячеек памяти размером с целое число для col1, col2 и col3, а также 1500 ячеек памяти размером с число с плавающей запятой для трассировки. Обратите внимание, что столбцы теперь представляют собой просто одиночные указатели, а не указатель на указатель. Это потому, что мы собираемся указывать на фактические значения внутри переменных, а не на сам указатель.

Теперь мы готовы прочитать строки из файла. Первое, что нам нужно сделать, это открыть файл для чтения:

Наша входнаяпеременная теперь равна удобочитаемой версии файла с именем нашей infileпеременной.

Чтобы прочитать строки во входном файле, мы можем использовать базовый цикл for-loop и fscanf:

В fscanf мы читаем из нашей входной переменной и присваиваем значения нашим четырем различным переменным столбца.

Теперь, когда файл прочитан, мы можем закрыть входнойфайл с помощью fclose:

Конечный результат нашей функции loadTrace должен выглядеть примерно так:

agcTrace

Эта функция выполнит сканирование AGC файла трассировки, загруженного функцией loadTrace. Эта функция не будет возвращать никаких значений обратно в основную программу, поэтому тип возвращаемого значения будет установлен как void:

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

Чтобы выполнить сканирование AGC, нам нужно отслеживать четыре разных вещи:

  • Сумма выборок в окне.
  • Сумма выборок во всей трассе.
  • Количество образцов в окне.
  • Количество выборок во всей трассе.

Мы объявим эти значения в верхней части функции:

Чтобы упростить работу с кодом, мы создадим новый указатель, который будет относиться к указателю trace, передаваемому в функцию. Мы также хотим создать указатель на временную область памяти для хранения новых значений после сканирования AGC, называемую outtrace. Это можно сделать, выполнив следующие действия:

С нашей новой переменной outtrace мы выделим ей 1500 ячеек памяти размером с число с плавающей запятой:

Теперь пришло время начать считывание образцов и выполнение сканирования. При нахождении средних значений для окна мы должны помнить о начале и конце трассы. Начало трассировки сможет использовать только переднюю половину нашего окна, а конец трассировки может использовать только вторую половину нашего окна. Чтобы избежать запуска нашего окна в конце нашей трассы, мы предварительно загрузим первую половину нашего окна в первый образец в трассе, затем мы можем проверить, выходит ли окно за пределы начала или конца нашей трассы. trace, когда мы выполняем сканирование. Чтобы предварительно загрузить первую половину окна:

Чтобы выполнить сканирование для каждого образца, мы можем использовать цикл for, который содержит пару условий if для проверки выхода окна за границы.

Помните, исходный сэмпл делится на среднюю амплитуду сэмплов в пределах окна. Мы можем реализовать наш AGC следующим образом:

После того, как наше основное сканирование завершено, нам нужно нормализовать результаты, чтобы мы могли получить согласованные амплитуды. Чтобы нормализовать выходные данные, мы умножим каждую выборку на среднюю амплитуду по всей трассе, используя цикл for:

Теперь, когда сканирование завершено, мы можем очистить outtraceячейки памяти:

Завершенная функция agcTrace теперь должна выглядеть примерно так:

сохранитьTrace

Функция saveTrace используется для сохранения вновь созданной трассировки в текстовый файл. Еще раз, эта функция не будет возвращать никакого значения обратно в основную функцию, поэтому мы можем объявить ее следующим образом:

Эта функция почти полностью аналогична функции loadTrace, поэтому реализация будет простой.

Основное отличие будет заключаться в том, что вместо указания имени файла для чтения вы указываете имя файла для записи. Это может быть выполнено следующим образом:

Мы будем использовать цикл for и fprintf для вывода переменных столбца в новый файл:

После завершения цикла for мы можем закрыть выходнойфайл и освободить всю память, относящуюся к нашей программе:

Завершенная функция saveTrace должна выглядеть примерно так:

Использование программы

Чтобы скомпилировать и запустить нашу недавно созданную программу, мы выполним следующие команды в каталоге, содержащем «agc.c»:

В папке, содержащей вашу программу, вы заметите, что создается новый файл, содержащий новый файл трассировки с именем «agctrace».

Результаты

После использования нашей программы 'agc.c' на трассировке вы заметите, что новая трасса будет выглядеть гораздо более согласованной, чем исходная трасса:

Когда эта процедура применяется к большому количеству трасс на сейсмографе, вы сможете получить более читаемый график:

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

Это всего лишь один пример программ, которые могут потребоваться от ГИС-работников. Теперь, когда у вас есть эта программа, вы на один шаг приблизились к созданию полезного программного обеспечения для обработки сейсмических данных и началу карьеры в отрасли ГИС.