1+ #!/usr/bin/env python3
2+ """
3+ Equal Loudness Filter Demo
4+
5+ This script demonstrates the usage of the Equal Loudness Filter for audio processing.
6+ It shows how the filter can be used to process audio samples and demonstrates
7+ the filter's behavior with different types of input signals.
8+ """
9+
10+ import math
11+ import sys
12+ from typing import List
13+
14+ from audio_filters .equal_loudness_filter import EqualLoudnessFilter
15+
16+
17+ def generate_test_signal (frequency : float , duration : float , samplerate : int , amplitude : float = 0.5 ) -> List [float ]:
18+ """
19+ Generate a simple sine wave test signal.
20+
21+ Args:
22+ frequency: Frequency of the sine wave in Hz
23+ duration: Duration of the signal in seconds
24+ samplerate: Sample rate in Hz
25+ amplitude: Amplitude of the sine wave (0-1)
26+
27+ Returns:
28+ List of audio samples
29+ """
30+ samples = []
31+ total_samples = int (duration * samplerate )
32+
33+ for i in range (total_samples ):
34+ t = i / samplerate # Time in seconds
35+ sample = amplitude * math .sin (2 * math .pi * frequency * t )
36+ samples .append (sample )
37+
38+ return samples
39+
40+
41+ def demonstrate_equal_loudness_filter ():
42+ """Main demonstration function."""
43+ print ("🎵 Equal Loudness Filter Demonstration" )
44+ print ("=" * 50 )
45+
46+ # Create filter instance
47+ samplerate = 44100
48+ filter_instance = EqualLoudnessFilter (samplerate )
49+
50+ print (f"Filter initialized with sample rate: { samplerate } Hz" )
51+ print (f"Filter order: { filter_instance .yulewalk_filter .order } " )
52+ print ()
53+
54+ # Test 1: Process silence
55+ print ("📌 Test 1: Processing silence" )
56+ silence_result = filter_instance .process (0.0 )
57+ print (f"Input: 0.0 → Output: { silence_result } " )
58+ assert silence_result == 0.0 , "Silence should remain silence"
59+ print ("✅ Silence test passed!" )
60+ print ()
61+
62+ # Test 2: Process various amplitude levels
63+ print ("📌 Test 2: Processing different amplitude levels" )
64+ test_amplitudes = [0.1 , 0.25 , 0.5 , 0.75 , 1.0 , - 0.1 , - 0.25 , - 0.5 , - 0.75 , - 1.0 ]
65+
66+ for amplitude in test_amplitudes :
67+ result = filter_instance .process (amplitude )
68+ print (f"Input: { amplitude :6.2f} → Output: { result :10.6f} " )
69+ print ("✅ Amplitude test completed!" )
70+ print ()
71+
72+ # Test 3: Process a sine wave
73+ print ("📌 Test 3: Processing a 1kHz sine wave" )
74+ test_freq = 1000 # 1kHz
75+ duration = 0.01 # 10ms
76+ sine_wave = generate_test_signal (test_freq , duration , samplerate , 0.3 )
77+
78+ print (f"Generated { len (sine_wave )} samples of { test_freq } Hz sine wave" )
79+
80+ # Process the sine wave
81+ filtered_samples = []
82+ for sample in sine_wave [:10 ]: # Show first 10 samples
83+ filtered_sample = filter_instance .process (sample )
84+ filtered_samples .append (filtered_sample )
85+ print (f"Sample: { sample :8.5f} → Filtered: { filtered_sample :8.5f} " )
86+
87+ print ("✅ Sine wave processing test completed!" )
88+ print ()
89+
90+ # Test 4: Filter reset functionality
91+ print ("📌 Test 4: Testing filter reset" )
92+
93+ # Process some samples to build internal state
94+ for _ in range (5 ):
95+ filter_instance .process (0.5 )
96+
97+ print ("Processed 5 samples to build internal state" )
98+
99+ # Check state before reset
100+ history_before = filter_instance .yulewalk_filter .input_history .copy ()
101+ print (f"Input history before reset: { history_before [:3 ]} ..." ) # Show first 3 values
102+
103+ # Reset the filter
104+ filter_instance .reset ()
105+
106+ # Check state after reset
107+ history_after = filter_instance .yulewalk_filter .input_history .copy ()
108+ print (f"Input history after reset: { history_after [:3 ]} ..." )
109+
110+ assert all (val == 0.0 for val in history_after ), "History should be cleared after reset"
111+ print ("✅ Reset test passed!" )
112+ print ()
113+
114+ # Test 5: Filter information
115+ print ("📌 Test 5: Filter configuration information" )
116+ filter_info = filter_instance .get_filter_info ()
117+
118+ for key , value in filter_info .items ():
119+ if isinstance (value , list ):
120+ print (f"{ key } : [{ len (value )} coefficients]" )
121+ else :
122+ print (f"{ key } : { value } " )
123+
124+ print ("✅ Filter info test completed!" )
125+ print ()
126+
127+ # Test 6: Different sample rates
128+ print ("📌 Test 6: Testing different sample rates" )
129+ test_samplerates = [22050 , 44100 , 48000 , 96000 ]
130+
131+ for sr in test_samplerates :
132+ test_filter = EqualLoudnessFilter (sr )
133+ result = test_filter .process (0.5 )
134+ print (f"Sample rate: { sr :6d} Hz → Result: { result :10.6f} " )
135+
136+ print ("✅ Sample rate test completed!" )
137+ print ()
138+
139+ print ("🎉 All demonstrations completed successfully!" )
140+ print ("\n The Equal Loudness Filter is ready for use in audio processing applications!" )
141+
142+
143+ if __name__ == "__main__" :
144+ try :
145+ demonstrate_equal_loudness_filter ()
146+ except ImportError as e :
147+ print (f"❌ Import error: { e } " )
148+ print ("Please ensure numpy is installed: pip install numpy" )
149+ sys .exit (1 )
150+ except Exception as e :
151+ print (f"❌ Demonstration failed: { e } " )
152+ sys .exit (1 )
0 commit comments