main application with tuning, playing, and GUI
This commit is contained in:
36
fmdemod3.py
Normal file
36
fmdemod3.py
Normal file
@@ -0,0 +1,36 @@
|
||||
import numpy as np
|
||||
import sounddevice as sd
|
||||
from scipy.io import wavfile
|
||||
from scipy.signal import decimate, butter, filtfilt
|
||||
|
||||
# Load the raw IQ samples from the file
|
||||
filename = "fm_capture6.bin"
|
||||
iq_samples = np.fromfile(filename, dtype=np.int8)
|
||||
|
||||
# Define the FM demodulation parameters
|
||||
sample_rate = int(2e6) # Sample rate of the IQ samples
|
||||
audio_sample_rate = int(48e3) # Desired audio sample rate
|
||||
fm_deviation = int(75e3) # FM deviation of the radio signal
|
||||
channel_width = int(200e3) # Channel width of the low-pass filter
|
||||
|
||||
# Design the low-pass filter
|
||||
nyquist_freq = sample_rate / 2
|
||||
cutoff_freq = channel_width / nyquist_freq
|
||||
b, a = butter(10, int(75e3), btype='low', fs=int(2e6))
|
||||
|
||||
# Apply the low-pass filter
|
||||
filtered_audio = filtfilt(b, a, iq_samples)
|
||||
|
||||
# Demodulate the FM signal
|
||||
demodulated_audio = np.diff(filtered_audio.astype(np.float32)) * np.conj(filtered_audio[:-1]).astype(np.float32)
|
||||
demodulated_audio = decimate(demodulated_audio, int(100))
|
||||
|
||||
# Normalize the audio to the range [-1, 1]
|
||||
normalized_audio = demodulated_audio / np.max(np.abs(demodulated_audio))
|
||||
|
||||
# Play the audio
|
||||
sd.play(normalized_audio, audio_sample_rate)
|
||||
sd.wait()
|
||||
|
||||
# output_filename = "demodulated_audio.wav"
|
||||
# wavfile.write(output_filename, audio_sample_rate, normalized_audio)
|
||||
Reference in New Issue
Block a user