mirror of
https://github.com/radio95-rnt/rds95.git
synced 2026-02-26 20:33:53 +01:00
95 lines
2.7 KiB
Python
95 lines
2.7 KiB
Python
PLOT = True
|
|
FFT = PLOT and True
|
|
|
|
import math
|
|
import io, os
|
|
if PLOT: import matplotlib.pyplot as plt
|
|
if FFT: import numpy as np
|
|
|
|
DATA_RATE = 1187.5
|
|
SIZE_RATIO = 1
|
|
|
|
ratio = 16
|
|
sample_rate = DATA_RATE*ratio
|
|
print(f"{sample_rate=}")
|
|
if not sample_rate.is_integer(): raise ValueError("Need a even value")
|
|
|
|
# this is modified from ChristopheJacquet's pydemod
|
|
def rrcosfilter(NumSamples):
|
|
T_delta = 1/float(sample_rate)
|
|
sample_num = list(range(NumSamples))
|
|
h_rrc = [0.0] * NumSamples
|
|
SymbolPeriod = 1/(2*DATA_RATE)
|
|
|
|
for x in sample_num:
|
|
t = (x-NumSamples/2)*T_delta
|
|
if t == 0.0: h_rrc[x] = 1.0 - 1 + (4/math.pi)
|
|
elif t == SymbolPeriod/4: h_rrc[x] = (1/math.sqrt(2))*(((1+2/math.pi) * (math.sin(math.pi/4))) + ((1-2/math.pi)*(math.cos(math.pi/4))))
|
|
elif t == -SymbolPeriod/4: h_rrc[x] = (1/math.sqrt(2))*(((1+2/math.pi) * (math.sin(math.pi/4))) + ((1-2/math.pi)*(math.cos(math.pi/4))))
|
|
else: h_rrc[x] = (4*(t/SymbolPeriod)*math.cos(math.pi*t*2/SymbolPeriod)) / (math.pi*t*(1-(4*t/SymbolPeriod)*(4*t/SymbolPeriod))/SymbolPeriod)
|
|
blackman = [0.42 + 0.5*math.cos(math.pi*i/(NumSamples-1)) + 0.08*math.cos(2.0*math.pi*i/(NumSamples-1)) for i in range(NumSamples)]
|
|
h_rrc = [h_rrc[i] * blackman[i] for i in range(NumSamples)]
|
|
|
|
return h_rrc
|
|
|
|
def convolve(a, b):
|
|
out = [0] * (len(a) + len(b) - 1)
|
|
for i in range(len(a)):
|
|
for j in range(len(b)):
|
|
out[i+j] += a[i] * b[j]
|
|
return out
|
|
|
|
PATH = os.path.dirname(os.path.abspath(__file__))
|
|
|
|
outc = io.open(f"{PATH}/src/waveforms.c", mode="w", encoding="utf8")
|
|
outh = io.open(f"{PATH}/src/waveforms.h", mode="w", encoding="utf8")
|
|
|
|
header = u"""
|
|
/* This file was automatically generated by "gen_wave.py".
|
|
(C) 2014 Christophe Jacquet.
|
|
(C) 2023 Anthony96922.
|
|
(C) 2025 kuba201.
|
|
Released under the GNU GPL v3 license.
|
|
*/
|
|
|
|
"""
|
|
|
|
outc.write(header)
|
|
outh.write(header)
|
|
|
|
def generate():
|
|
t = [i / sample_rate for i in range(ratio)]
|
|
out = [math.sin(2 * math.pi * DATA_RATE * time) for time in t]
|
|
print(f"{len(out)=} {len(out)/sample_rate=} {1/DATA_RATE=}")
|
|
|
|
if PLOT:
|
|
plt.plot(out*4, label="out")
|
|
plt.legend()
|
|
plt.axvline(x=len(out)*2, color='r', linestyle='--', label='center')
|
|
plt.grid(True)
|
|
plt.show()
|
|
|
|
if FFT:
|
|
N = len(out)
|
|
fft_out = np.fft.fft(out)
|
|
fft_freqs = np.fft.fftfreq(N, d=1/sample_rate)
|
|
|
|
plt.figure(figsize=(10, 6))
|
|
plt.plot(fft_freqs[:N//2], np.abs(fft_out)[:N//2])
|
|
plt.xlim(0,DATA_RATE*2.5)
|
|
plt.title("FFT of the waveform")
|
|
plt.xlabel("Frequency (Hz)")
|
|
plt.ylabel("Magnitude")
|
|
plt.grid(True)
|
|
plt.show()
|
|
|
|
outc.write(u"float waveform_biphase[{size}] = {{{values}}};\n\n".format(
|
|
values = u", ".join(map(str, out)),
|
|
size = len(out)))
|
|
|
|
outh.write(u"extern float waveform_biphase[{size}];\n".format(size=len(out)))
|
|
|
|
generate()
|
|
|
|
outc.close()
|
|
outh.close() |