diff --git a/tnc/modem.py b/tnc/modem.py index ae82e8f0..6ffeb5fe 100644 --- a/tnc/modem.py +++ b/tnc/modem.py @@ -22,6 +22,7 @@ import static import data_handler #import Hamlib +import numpy as np import rigctld rigctld = rigctld.Rigctld() @@ -458,7 +459,7 @@ class RF(): data_in = self.stream_rx.read(nin, exception_on_overflow=False) - #self.calculate_fft(data_in) + self.calculate_fft(data_in) data_in = audioop.ratecv(data_in,2,1,static.AUDIO_SAMPLE_RATE_RX, static.MODEM_SAMPLE_RATE, None) @@ -643,70 +644,16 @@ class RF(): def calculate_fft(self, data_in): - data_in_array = np.frombuffer(data_in, dtype=np.int16) - #print(fft_raw) - #fft_raw = fft(data_in_array) - #print(fft_raw) - #fft_raw = data_in.hex() - #print(fft_raw) - #static.FFT = fft_raw.tolist() - #fft_raw = fft_raw.tobytes() - - #rate = 48000 - #M = 1024 - #freqs, times, Sx = signal.spectrogram(data_in_array, fs=rate, window='hanning', nperseg=1024, noverlap=M - 100, detrend=False, scaling='spectrum', return_onesided=True) - - #freqs, times, Sx = signal.spectrogram(data_in_array, fs=rate, return_onesided=True, axis=-1) - - - - - #print(Sx) - - #fft_raw = Sx.tobytes() - #print(fft_raw) - #static.FFT = fft_raw.hex() - #static.FFT = fft_raw - #data_in = np.frombuffer(data_in, dtype=np.int16) - #data = fft(data_in) - #print(data) - #data = getFFT(data_in, 48000, 2048) - #print(data) - - #data = abs(data) * 2 / np.sum(8192) - - #data = abs(data) // np.sum(1024) - - - #data = np.frombuffer(data_in, dtype=np.int16) - #data.resize((1,2048)) - #data = np.delete(data,0) - - - #data = data.tobytes() - #print(data) - #static.FFT = data.tolist() - #static.FFT = data.hex() - -def getFFT(data, rate, chunk_size, log_scale=False): - data = data * np.hamming(len(data)) - try: - FFT = np.abs(np.fft.rfft(data)[1:]) - except: - FFT = np.fft.fft(data) - left, right = np.split(np.abs(FFT), 2) - FFT = np.add(left, right[::-1]) - - #fftx = np.fft.fftfreq(chunk_size, d=1.0/rate) - #fftx = np.split(np.abs(fftx), 2)[0] - - if log_scale: - try: - FFT = np.multiply(20, np.log10(FFT)) - except Exception as e: - print('Log(FFT) failed: %s' %str(e)) - - return FFT + + # https://gist.github.com/ZWMiller/53232427efc5088007cab6feee7c6e4c + audio_data = np.fromstring(data_in, np.int16) + # Fast Fourier Transform, 10*log10(abs) is to scale it to dB + # and make sure it's not imaginary + dfft = 10.*np.log10(abs(np.fft.rfft(audio_data))) + print(dfft.tolist()) + dfftlist = dfft.tolist() + static.FFT = dfftlist[:512] + return dfft