1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
| import numpy as np
from scipy import signal
class AcousticAnalysis:
def __init__(self):
self.audio_traces = []
self.sample_rate = 44100
def simulate_keyboard_sound(self, keystrokes):
"""Simulate keyboard sound"""
audio = []
for keystroke in keystrokes:
# Generate key sound
frequency = self.get_key_frequency(keystroke)
duration = 0.1 # 100ms
# Generate sinusoidal wave
t = np.linspace(0, duration, int(self.sample_rate * duration))
wave = np.sin(2 * np.pi * frequency * t)
# Add envelope
envelope = np.exp(-t * 10)
wave *= envelope
# Add noise
noise = np.random.normal(0, 0.1, len(wave))
wave += noise
audio.extend(wave)
return np.array(audio)
def get_key_frequency(self, key):
"""Get key frequency"""
# Simplified key to frequency mapping
key_frequencies = {
'a': 440, 'b': 466, 'c': 523, 'd': 587, 'e': 659,
'f': 698, 'g': 784, 'h': 880, 'i': 988, 'j': 1047,
'k': 1175, 'l': 1319, 'm': 1397, 'n': 1568, 'o': 1760,
'p': 1976, 'q': 2093, 'r': 2349, 's': 2637, 't': 2794,
'u': 3136, 'v': 3520, 'w': 3951, 'x': 4186, 'y': 4699,
'z': 5274
}
return key_frequencies.get(key.lower(), 440)
def analyze_audio(self, audio):
"""Analyze audio to extract information"""
# Fourier transform
fft = np.fft.fft(audio)
frequencies = np.fft.fftfreq(len(audio), 1/self.sample_rate)
# Find peaks
peaks = []
for i in range(1, len(fft) - 1):
if abs(fft[i]) > abs(fft[i-1]) and abs(fft[i]) > abs(fft[i+1]):
if abs(fft[i]) > np.mean(np.abs(fft)) + 2 * np.std(np.abs(fft)):
peaks.append(frequencies[i])
return peaks
def visualize_audio_spectrum(self, audio, title="Audio Spectrum"):
"""Visualize audio spectrum"""
fft = np.fft.fft(audio)
frequencies = np.fft.fftfreq(len(audio), 1/self.sample_rate)
plt.figure(figsize=(12, 6))
plt.plot(frequencies[:len(frequencies)//2], np.abs(fft[:len(fft)//2]))
plt.title(title)
plt.xlabel("Frequency (Hz)")
plt.ylabel("Amplitude")
plt.grid(True)
plt.show()
# Usage example
acoustic_analysis = AcousticAnalysis()
keystrokes = ['p', 'a', 's', 's', 'w', 'o', 'r', 'd']
audio = acoustic_analysis.simulate_keyboard_sound(keystrokes)
peaks = acoustic_analysis.analyze_audio(audio)
print(f"Detected audio peaks: {peaks}")
|