### Filters

This example shows the basics of working with filter modules. We'll expand on the gain stage we built in the Hello World example.

import zrna
z = zrna.api.Client()
z.connect()
z.clear()

# Declare IO as before
audio_in = z.AudioIn()
audio_out = z.AudioOut()

# This time we'll work with a lowpass
# filter instead of a gain module

# 1st order lowpass
lpf = z.FilterLowpass()

# Let's check what parameters it has
print(lpf.parameters) # ['corner_frequency', 'gain']

# We'll leave the gain at unity
# and sweep the corner frequency

# Check range
print(lpf.corner_frequency.minimum) # 4.0
print(lpf.corner_frequency.maximum) # 400.0

# By default the corner frequency
# can vary from 4 kHz to 400 kHz

# We're working with an audio signal so
# let's move this range down by adjusting
# the module clock divisor
lpf.set_clock(z.CLOCK3)

# Check the range again
print(lpf.corner_frequency.minimum) # 0.25
print(lpf.corner_frequency.maximum) # 25.0

# Great now we can sweep from 250 Hz to 25 kHz

# Let's wire up our modules
audio_in.output.connect(lpf.input)
lpf.output.connect(audio_out.input)

# Set the corner frequency to the minimum value
lpf.corner_frequency = 0.25

# Set the circuit in motion
z.run()

# Log sweep from 250 Hz to 25 kHz over 10 seconds
import numpy
import math
import time

f_low = 0.25
f_high = 20.0
steps = 1000

while True:
for f in numpy.logspace(math.log(f_low, 10),
math.log(f_high, 10),
steps):
lpf.corner_frequency = f
time.sleep(0.01)