Skip to content

Commit f31045e

Browse files
committed
Create demo_equal_loudness_filter.py
1 parent 041adef commit f31045e

1 file changed

Lines changed: 152 additions & 0 deletions

File tree

Lines changed: 152 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,152 @@
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("\nThe 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

Comments
 (0)