mirror of
https://github.com/DJ2LS/FreeDATA
synced 2024-05-14 08:04:33 +00:00
adjusted fft - still not correct
This commit is contained in:
parent
d23333f4ab
commit
159d2146a4
2 changed files with 33 additions and 1 deletions
|
@ -210,6 +210,36 @@ def set_audio_volume(datalist: np.ndarray, dB: float) -> np.ndarray:
|
||||||
RMS_COUNTER = 0
|
RMS_COUNTER = 0
|
||||||
CHANNEL_BUSY_DELAY = 0
|
CHANNEL_BUSY_DELAY = 0
|
||||||
|
|
||||||
|
|
||||||
|
def prepare_data_for_fft(data, target_length_samples=400):
|
||||||
|
"""
|
||||||
|
Prepare data array for FFT by padding if necessary to match the target length.
|
||||||
|
Center the data if it's shorter than the target length.
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
- data: numpy array of np.int16, representing the input data.
|
||||||
|
- target_length_samples: int, the target length of the data in samples.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
- numpy array of np.int16, padded and/or centered if necessary.
|
||||||
|
"""
|
||||||
|
# Calculate the current length in samples
|
||||||
|
current_length_samples = data.size
|
||||||
|
|
||||||
|
# Check if padding is needed
|
||||||
|
if current_length_samples < target_length_samples:
|
||||||
|
# Calculate total padding needed
|
||||||
|
total_pad_length = target_length_samples - current_length_samples
|
||||||
|
# Calculate padding on each side
|
||||||
|
pad_before = total_pad_length // 2
|
||||||
|
pad_after = total_pad_length - pad_before
|
||||||
|
# Pad the data to center it
|
||||||
|
data_padded = np.pad(data, (pad_before, pad_after), 'constant', constant_values=(0,))
|
||||||
|
return data_padded
|
||||||
|
else:
|
||||||
|
# No padding needed, return original data
|
||||||
|
return data
|
||||||
|
|
||||||
def calculate_fft(data, fft_queue, states) -> None:
|
def calculate_fft(data, fft_queue, states) -> None:
|
||||||
"""
|
"""
|
||||||
Calculate an average signal strength of the channel to assess
|
Calculate an average signal strength of the channel to assess
|
||||||
|
@ -225,6 +255,7 @@ def calculate_fft(data, fft_queue, states) -> None:
|
||||||
global RMS_COUNTER, CHANNEL_BUSY_DELAY
|
global RMS_COUNTER, CHANNEL_BUSY_DELAY
|
||||||
|
|
||||||
try:
|
try:
|
||||||
|
data = prepare_data_for_fft(data, target_length_samples=800)
|
||||||
fftarray = np.fft.rfft(data)
|
fftarray = np.fft.rfft(data)
|
||||||
|
|
||||||
# Set value 0 to 1 to avoid division by zero
|
# Set value 0 to 1 to avoid division by zero
|
||||||
|
|
|
@ -280,7 +280,8 @@ class RF:
|
||||||
try:
|
try:
|
||||||
if not self.audio_out_queue.empty() and not self.enqueuing_audio:
|
if not self.audio_out_queue.empty() and not self.enqueuing_audio:
|
||||||
chunk = self.audio_out_queue.get_nowait()
|
chunk = self.audio_out_queue.get_nowait()
|
||||||
audio.calculate_fft(chunk, self.fft_queue, self.states)
|
audio_8k = self.resampler.resample48_to_8(chunk)
|
||||||
|
audio.calculate_fft(audio_8k, self.fft_queue, self.states)
|
||||||
outdata[:] = chunk.reshape(outdata.shape)
|
outdata[:] = chunk.reshape(outdata.shape)
|
||||||
|
|
||||||
else:
|
else:
|
||||||
|
|
Loading…
Reference in a new issue