Spaces:
Sleeping
Sleeping
import numpy as np | |
class FIR: | |
""" | |
FIR (Finite Impulse Response) filter implementation | |
Converted from C implementation in FIRFilter.c | |
""" | |
def __init__(self, step_size): | |
"""Initialize the FIR filter""" | |
self.N = step_size | |
self.input_buffer = np.zeros(2 * step_size, dtype=float) | |
def check_range(input_val): | |
"""Limit the value to the range [-1.0, 1.0]""" | |
if input_val > 1.0: | |
return 1.0 | |
elif input_val < -1.0: | |
return -1.0 | |
else: | |
return input_val | |
def init_fir(step_size): | |
"""Create a new FIR filter instance""" | |
return FIR(step_size) | |
def process_fir_filter(fir, input_signal, filter_coefficients): | |
""" | |
Process input through the FIR filter | |
Args: | |
fir: FIR filter instance | |
input_signal: Input signal array | |
filter_coefficients: Filter coefficients array | |
Returns: | |
output_signal: Filtered output signal | |
""" | |
# Create output array | |
output = np.zeros(fir.N, dtype=float) | |
# Update input buffer | |
fir.input_buffer[: fir.N] = fir.input_buffer[fir.N :] | |
fir.input_buffer[fir.N :] = input_signal | |
# Apply FIR filter | |
for i in range(fir.N): | |
temp = 0.0 | |
for j in range(len(filter_coefficients)): | |
idx = fir.N + (i - j) | |
if idx >= 0 and idx < 2 * fir.N: # Ensure index is in bounds | |
temp += fir.input_buffer[idx] * filter_coefficients[j] | |
output[i] = check_range(temp) | |
return output | |
def destroy_fir(fir): | |
""" | |
Clean up resources (not necessary in Python due to garbage collection) | |
Included for API compatibility with C code | |
""" | |
# In Python, memory management is automatic | |
pass | |