Как передать данные по звуку с помощью фазовой манипуляции? - PullRequest
0 голосов
/ 10 апреля 2019

Я пытаюсь отправить данные по звуку с использованием ультразвуковой частоты.По этой причине мне нужно реализовать фазовую манипуляцию модуляции и демодуляции.Я должен реализовать это в C # с помощью NAudio.

Я прошел один проект, который я не понимаю, потому что, в основном, у меня нет опыта в цифровой обработке сигналов.Ссылка на проект GitHub прилагается ниже.https://github.com/Katee/quietnet В этом проекте автор использовал pyaudio.Я понимаю отправляющую часть (send.py).Но в части прослушивания я не могу понять некоторые части.

Кстати, я рассмотрел библиотеку CHIRP.Но это не доступно для xamerin.Поэтому я должен написать свой собственный модуль.

Для начала я не понимаю этот кусок кода

def get_peak(hertz, rate, chunk):
    return int(round((float(hertz) / rate) * chunk))

Я не могу понять, как деление частоты на частоту дискретизации и умножение количества кусков вернет peak_index

def process_points():
    while True:
        cur_points = []
        while len(cur_points) < frame_length:
            try:
                cur_points.append(points.get(False))
            except Queue.Empty:
                time.sleep(wait_for_point_timeout)

        while True:
            while np.average(cur_points) > bottom_threshold:
                try:
                    cur_points.append(points.get(False))
                    cur_points = cur_points[1:]
                except Queue.Empty:
                    time.sleep(wait_for_point_timeout)
            next_point = None
            while next_point == None:
                try:
                    next_point = points.get(False)
                except Queue.Empty:
                    time.sleep(wait_for_point_timeout)
            if next_point > bottom_threshold:
                bits.put(0)
                bits.put(0)
                cur_points = [cur_points[-1]]
                break
        print("")

        last_bits = []
        while True:
            if len(cur_points) == frame_length:
                bit = int(quietnet.get_bit(cur_points, frame_length) > bottom_threshold)
                cur_points = []
                bits.put(bit)
                last_bits.append(bit)
            # if we've only seen low bits for a while assume the next message might not be on the same bit boundary
            if len(last_bits) > 3:
                if sum(last_bits) == 0:
                    break
                last_bits = last_bits[1:]
            try:
                cur_points.append(points.get(False))
            except Queue.Empty:
                time.sleep(wait_for_point_timeout)

Кроме того, если мы используем более высокую частоту, у нас следует выполнить цикл, пока мы не получим более низкие пороговые значения.

По сути, я спрашиваю, может ли кто-нибудь предложить мне некоторую ссылку на DSP и фазовую манипуляцию, чтобыя могу понять этот проект и реализовать его в C # .Net.

...