Как стать автором
Обновить

Software Defined Radio — как это работает? Часть 4

Время на прочтение 10 мин
Количество просмотров 43K
Всего голосов 47: ↑47 и ↓0 +47
Комментарии 26

Комментарии 26

Слушать две станции оригинально, но на практике мало полезно

github.com/szpajder/RTLSDR-Airband

RTLSDR-Airband receives analog radio voice channels and produces audio streams which can be routed to various outputs, such as online streaming services like LiveATC.net

Для полноты совпадения функционала вместо записи необходимо реализовать вещание в сеть
Да, в GNU Radio есть компонент UDP Sink который можно использовать вместо File Sink. WBFM-декодер также придется поменять на AM, если нужно принимать air band.
Air band эта программа и так принимает, а с NFM у нее некие проблемы с производительностью.
Возможно кому-то важно мониторить несколько частот: репитеры, вызывные и т.д.
спасибо за интересный материал.
с интересом жду продолжения про передачу
Слышал что с помощью этого софта можно создать «поддельную» базовую станцию GSM и перехватывать трафик?
Есть проект OpenBTS но в подробности не вникал.
www.youtube.com/watch?v=mRuq7EP--yM

Правда не уверен что он на базе GNU Radio, хотя может быть.
Пассивно послушать можно, но толку от этого немного.
Для нормального взаимодействия нужен приёмопередатчик, пусть и с небольшой мощностью, типа LimeSDR
Если бы в учебных заведениях делали бы лабораторные работы в gnu radio с копеечными приемниками RTL, качество обучения выросло бы в разы. Когда своими глазами спектрограмму по времени увидел, сразу видишь разницу, и это откладывается в мозгу.
А сейчас по факту, даже после экзаменов 80% потока не понимает разницы между этими всеми AM FM PSK.
В школах до сих пор Borland Pascal под MS-DOS изучают (только вместо оригинального доса DOSBox), какое там GNU Radio…

А так да, верно, SDR в разы нагляднее в плане представления сигналов и работы с ними.
Считаю, что Паскаль идеален для обучения, чтобы не говорило каждое поколение студентов. Сам таким был.
Хотя и для школы он может быть сложноват. До сих пор помню школьную олимпиаду по информатике, нам предложили на выбор QBasic или Паскаль, 2 из 30 выбрали Паскаль, и их отвели в отдельный кабинет. Среди оставшихся в коридоре послышался возглас «самоубийцы», и все единодушно согласились. В итоге с Бейсиком сидели за компами, у которых «вся мощь в клавиатуре», если кто помнит такие, а год был 2000.
Ещё была занятная история с Паскалем, где-то в 2012 году. Нужно было помочь дочери коллеги с лабораторной работой в универе. Первые три лабы делались в Borland pascal, я ещё тогда удивился почему не в Delphi или Lazarus. Ладно, показал Lazarus, сделали в нем по быстрому, проверили в Borland, и разошлись. Потом в середине семестра снова пришли, им нужно было сделать простенькую игру типа танчиков. Классический game_step() без всяких заморочек, управление с клавиатуре стрелками и вывод на экран uses graph; и вот это вот все. И как то я сразу не нашёл современной альтернативы на тот момент (да и сейчас тоже) для написания примитивной игры с использованием графики. В итоге использовали Lazarus в качестве редактора, и досбокс для проверки.
Сейчас все это замечательно делается в Python — и консольные приложения, и даже графика и UI. Код простой и понятный, и ничуть не сложнее Паскаля, и работает везде (Windows, Linux, OSX). Для совсем маленьких есть Sketch.

Понятно что учителям так проще, да и пособия, планы и методички давно написаны. Ладно в школе, сдали и забыли, всем пофиг, но ведь университет должен готовить специалистов с актуальными знаниями, а не с опытом работы в DOSBox.

Разумеется, в ДОС было проще — система однозадачная, включил и работай. Сейчас чтобы написать что-то, нужно больше кода. Ну а что делать, жизнь меняется…
Про досбокс есть нюансы. В универе изучали немного ассемблер и систему прерываний x86. Так вот лабы можно было сделать или на компах с win9x или в dosbox, или на различных SoC, которых не было. Так что, условный дос нельзя выкидывать из курса. Другой вопрос, что на большинстве специальностей аппаратный уровень вообще не затрагивается, и как работает графический режим всем пофиг.
Аналогичная ситуация сейчас в телевидении, аналоговый сигнал везде выключают, как работает видеоаппаратура никто не знает. Если выкинуть исторический базис систем из обучения, то общий уровень подготовки падает.
Ассемблер можно и сейчас использовать даже из Си, там и команды MMX и много чего интересного. Прерывания ДОС изучать смысла уже точно нет, те же прерывания на любом микроконтроллере есть, да хоть в Ардуине, которые стоят 5$/шт. Если реально углубляться в железо для соответствующих специальностей, то наверно FPGA нужен, да они сейчас тоже дешевые, если топовые модели не брать.

Это вопрос желания и компетенции преподавателей, в первую очередь, хотя тут и системная проблема конечно — если есть утвержденный учебный план, далеко от него не уйдешь, написано ДОС значит будет дос…
Прерывания доса, кстати не изучались, скорее изучалась сама парадигма программирования с прерываниями, ну и то, что они нужны для работы с периферией. Использовать для этого отдельную железку не нужно было. И в данном контексте досбокс всего лишь инструмент.
Тогда это было так удивительно, что основной поток программы может быть прерван функцией той же самой программы.
Про змейку посмотрю, спасибо. Питон на питоне)
На самом деле, с «железом» оно даже интереснее — чисто на компьютере зачастую слишком абстрактно, а когда что-то мигает или по столу ездит, смотрится совершенно иначе :)

Сейчас все это в Ардуине есть, те же прерывания от GPIO, можно кнопку подключить и смотреть как код выполняется.
Чисто в Винде прерывания от клавиатуры также работают, только называются уже message а не interrupt, всякие WM_KEYDOWN/WM_KEYUP с кодами клавиш: docs.microsoft.com/en-us/windows/desktop/inputdev/using-keyboard-input

Понятно что общий принцип можно объяснить на чем угодно, но и актуальность тоже важна — когда ученики видят, что им дают материал 20-летней давности, то и отношение соответствующее.

Смотрю учебник информатики, изданный в 2015м году informika-e.ru/S2/10_SEMAKIN.pdf и вижу там опять Паскаль — о господи, зачем? Они там ни до прерываний не дошли, ни до графики. Зачем грузить учеников никому не нужным материалом? Да на том же Питоне или Си все переписать, и проще и понятнее было бы. Это просто проф.непригодность авторов в вопросах современного программирования (я не исключаю что эти авторы сами никогда программистами и не работали и дальше своего пед.вуза не выходили) или полное нежелание что-то менять — проще старый материал еще раз перепечатать.
И как то я сразу не нашёл современной альтернативы на тот момент (да и сейчас тоже) для написания примитивной игры с использованием графики.

Вот для примера «змейка» на Python, проще некуда, и работает без необходимости какого-либо доса.
snake.py
import pygame
 
# --- Globals ---
# Colors
BLACK = (0, 0, 0)
WHITE = (255, 255, 255)
 
# Set the width and height of each snake segment
segment_width = 15
segment_height = 15
# Margin between each segment
segment_margin = 3
 
# Set initial speed
x_change = segment_width + segment_margin
y_change = 0
 
 
class Segment(pygame.sprite.Sprite):
    """ Class to represent one segment of the snake. """
    # -- Methods
    # Constructor function
    def __init__(self, x, y):
        # Call the parent's constructor
        super().__init__()
 
        # Set height, width
        self.image = pygame.Surface([segment_width, segment_height])
        self.image.fill(WHITE)
 
        # Make our top-left corner the passed-in location.
        self.rect = self.image.get_rect()
        self.rect.x = x
        self.rect.y = y
 
# Call this function so the Pygame library can initialize itself
pygame.init()
 
# Create an 800x600 sized screen
screen = pygame.display.set_mode([800, 600])
 
# Set the title of the window
pygame.display.set_caption('Snake Example')
 
allspriteslist = pygame.sprite.Group()
 
# Create an initial snake
snake_segments = []
for i in range(15):
    x = 250 - (segment_width + segment_margin) * i
    y = 30
    segment = Segment(x, y)
    snake_segments.append(segment)
    allspriteslist.add(segment)
 
 
clock = pygame.time.Clock()
done = False
 
while not done:
 
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            done = True
 
        # Set the speed based on the key pressed
        # We want the speed to be enough that we move a full
        # segment, plus the margin.
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_LEFT:
                x_change = (segment_width + segment_margin) * -1
                y_change = 0
            if event.key == pygame.K_RIGHT:
                x_change = (segment_width + segment_margin)
                y_change = 0
            if event.key == pygame.K_UP:
                x_change = 0
                y_change = (segment_height + segment_margin) * -1
            if event.key == pygame.K_DOWN:
                x_change = 0
                y_change = (segment_height + segment_margin)
 
    # Get rid of last segment of the snake
    # .pop() command removes last item in list
    old_segment = snake_segments.pop()
    allspriteslist.remove(old_segment)
 
    # Figure out where new segment will be
    x = snake_segments[0].rect.x + x_change
    y = snake_segments[0].rect.y + y_change
    segment = Segment(x, y)
 
    # Insert new segment into the list
    snake_segments.insert(0, segment)
    allspriteslist.add(segment)
 
    # -- Draw everything
    # Clear screen
    screen.fill(BLACK)
 
    allspriteslist.draw(screen)
 
    # Flip screen
    pygame.display.flip()
 
    # Pause
    clock.tick(5)
 
pygame.quit()


Другой пример еще проще.
rectangle.py
import pygame
 
# Define some colors
BLACK = (0, 0, 0)
WHITE = (255, 255, 255)
GREEN = (0, 255, 0)
RED = (255, 0, 0)
 
pygame.init()
 
# Set the height and width of the screen
size = [700, 500]
screen = pygame.display.set_mode(size)
 
pygame.display.set_caption("Bouncing Rectangle")
 
# Loop until the user clicks the close button.
done = False
 
# Used to manage how fast the screen updates
clock = pygame.time.Clock()
 
# Starting position of the rectangle
rect_x = 50
rect_y = 50
 
# Speed and direction of rectangle
rect_change_x = 2
rect_change_y = 2
 
# -------- Main Program Loop -----------
while not done:
    # --- Event Processing
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            done = True
 
    # --- Logic
    # Move the rectangle starting point
    rect_x += rect_change_x
    rect_y += rect_change_y
 
    # Bounce the ball if needed
    if rect_y > 450 or rect_y < 0:
        rect_change_y = rect_change_y * -1
    if rect_x > 650 or rect_x < 0:
        rect_change_x = rect_change_x * -1
 
    # --- Drawing
    # Set the screen background
    screen.fill(BLACK)
 
    # Draw the rectangle
    pygame.draw.rect(screen, WHITE, [rect_x, rect_y, 50, 50])
    pygame.draw.rect(screen, RED, [rect_x + 10, rect_y + 10, 30, 30])
 
    # --- Wrap-up
    # Limit to 60 frames per second
    clock.tick(60)
 
    # Go ahead and update the screen with what we've drawn.
    pygame.display.flip()
 
# Close everything down
pygame.quit()


Для запуска: pip install pygame и python snake.py или python rectangle.py.
GNU Radio для приема fm? Микроскопом забивать гвозди. gqrx для этого более чем достаточно и еще в кв диапазон можно перевести. Впрочем, если я правильно понял, статья больше для обучения что есть весьма хорошо. К сожалению людей понимающих как это все работает очень мало. Про аналоговые цепи вообще уже забыли а ведь даже примитивный преселектор разгрузит цап весьма не плохо.

Спасибо за статью.
Как вводная в гнурадио очень даже хорошо.
Кстати для того чтобы пути тоже были кроссплатформенными можно использовать что-то вроде:


import os
os.path.join(os.path.curdir, 'file.name')
Спасибо Вам, DmitrySpb79, за интересные статьи по SDR. Жду продолжения в том же духе.
Sink (выход, «слив»)

Это слово, скорее всего, переводится как "коллектор". Полупроводники и всё такое.

Нет, тут по смыслу не коллектор все-таки, а именно выход наружу.

Выход наружу называется "out". Line-out, к примеру.

GNU Radio по замыслу авторов работает с потоками данных (data flow), так что термин sink думаю, использовался вполне намеренно: wiki.gnuradio.org/index.php/TutorialsCoreConcepts

Тема технических переводов без контекста вообще непростая, помнится, один переводчик перевел в электротехническом тексте то ли «конденсатор», то ли «емкость» как tank, что получилось довольно-таки смешно.
У этой части просмотров будет больше
Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

Публикации

Истории