FSK-демодуляция и получение двоичной последовательностиPython

Программы на Python
Ответить
Anonymous
 FSK-демодуляция и получение двоичной последовательности

Сообщение Anonymous »

Я пытаюсь выполнить демодуляцию определенного сигнала, присутствующего в файле. Я заряжаю файл, фильтрую целевой сигнал и затем пытаюсь его демодулировать. Это FSK, и все параметры в коде хорошие (сигнал знаю, пробовал другой программой, демодулировалось отлично). Фильтр тоже хорош (я правильно сохраняю сигнал, когда пересохраняю только целевой сигнал). Итак, проблема в том, что я не получаю правильный двоичный поезд, и я не понимаю, почему. У меня есть двоичный поезд, но это не то, что мне положено (полученный двоичный поезд длиннее, чем мне положено, и это неправильно).
Приведем код:
import numpy as np
from scipy.signal import butter, filtfilt, resample_poly
from tkinter import filedialog
import math

lowcut, highcut = 1452550, 1498792 # F_min and F_max (position of my target signal in the file)

# Demodulation FSK
def demodulation_fsk(data, frequencies, fs):
t = np.linspace(0, len(data)/fs, len(data), endpoint=False)
demodulated_signals = np.zeros((len(frequencies), len(data)))
for i, freq in enumerate(frequencies):
fsk_signal = data * np.exp(-1.j * 2 * np.pi * freq * t)
demodulated_signal = np.abs(np.fft.fft(fsk_signal))
demodulated_signals[i, :] = demodulated_signal
demodulated = np.argmax(demodulated_signals, axis=0)
return demodulated

# Get binary train
def recup_TB(demod, niveau_FSK):
num_bits = int(math.log2(niveau_FSK))
bit_string = "".join(format(x, f'0{num_bits}b') for x in demod) # FSK2 (1 bit) : 0 or 1, FSK4 (2 bits) : 00, 01 , 10 or 11, FSK8 (3 bits) : 000, 001, 010, 100, ...
return bit_string

filename = filedialog.askopenfilename(title="Selection d'un fichier IQ")
if filename != "":
data = np.fromfile(filename, dtype=np.int16).astype(np.float32).view(np.complex64) # opening the file, visualisation of the data in complex64

# Filter on my target signal in the file
freq_echan = 15625000 # my default sampling frequency (from my original file)
order = 1
fcenter = (highcut + lowcut) / 2
largeur = (highcut - lowcut) / 2
t = np.arange(len(data)) / freq_echan
iq_shifted = data * np.exp(-1.j * 2 * np.pi * fcenter * t)
b, a = butter(order, largeur / (freq_echan / 2), btype="low")
y = filtfilt(b, a, iq_shifted)
common = math.gcd(int(freq_echan), int(2 * largeur))
up = int(2 * largeur // common)
down = int(freq_echan // common)
data = resample_poly(y, up, down)

# Parameters
fc = (highcut + lowcut) / 2 # center of my signal
fs = int(highcut - lowcut) # Use bandwith as new sampling frequency
rapidite_modulation = 19000 # in Bauds (Bd)
symbol_duration = 1 / rapidite_modulation
samples_per_symbol = int(symbol_duration * fc)
shift = 10000 # in Hz
niveau_FSK = 2
if niveau_FSK == 2:
frequencies = [fc - (shift / 2), fc + (shift / 2)]
if niveau_FSK == 4:
frequencies = [fc - (2 * shift / 2), fc - (shift / 2), fc + (shift / 2), fc + (2 * shift / 2)]
if niveau_FSK == 8:
frequencies = [fc - (4 * shift / 2), fc - (3 * shift / 2), fc - (2 * shift / 2), fc - (shift / 2), fc + (shift / 2), fc + (2 * shift / 2), fc + (3 * shift / 2), fc + (4 * shift / 2)]
if niveau_FSK == 16:
frequencies = [fc - (8 * shift / 2), fc - (7 * shift / 2), fc - (6 * shift / 2), fc - (5 * shift / 2), fc - (4 * shift / 2), fc - (3 * shift / 2), fc - (2 * shift / 2), fc - (shift / 2), fc + (shift / 2), fc + (2 * shift / 2), fc + (3 * shift / 2), fc + (4 * shift / 2), fc + (5 * shift / 2), fc + (6 * shift / 2), fc + (7 * shift / 2), fc + (8 * shift / 2)]

demod = demodulation_fsk(data, frequencies, fs)
TB = recup_TB(demod, niveau_FSK)
print(TB)


Подробнее здесь: https://stackoverflow.com/questions/793 ... nary-train
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»