Skip to content

Instantly share code, notes, and snippets.

@unanoc
Last active May 27, 2019 06:49
Show Gist options
  • Save unanoc/2494f93df6e4f7a71843a9c68b560b55 to your computer and use it in GitHub Desktop.
Save unanoc/2494f93df6e4f7a71843a9c68b560b55 to your computer and use it in GitHub Desktop.
reverbation signals
import numpy as np
import matplotlib.pyplot as plt
import pyaudio
import random
FREQUENCY = 20000 # частота сигнала
AMP = 1 # амплитуда сигнала
N = 88200 # количество точек для расчета (частота дескретизации)
TIME_MAX = 1 # промежуток времени, на котором будет проводится исследование (в секундах)
D_TIME = TIME_MAX/N # дельта времени, на которую разбивается интервал исследования
class Signal:
def __init__(self, distance, value=None):
self.distance = distance
if value is None:
self.value = []
else:
self.value = value
def point(self, time, frequency, amp):
return amp * np.sin(2. * np.pi * frequency * time)
def make_signal(self, frequency, time_max, n, amp):
signal = []
times = np.linspace(0, time_max, n*time_max)
for time in times:
p = self.point(time, frequency, amp)
signal.append(p)
self.value = signal
def reverberation(num_areas, base_signal): # получаем отраженные сигналы
new_signals = []
for i in range(num_areas):
signal = Signal(distance=i)
koef = i**(2)+1
signal.value = np.array(base_signal.value) / koef
new_signals.append(signal)
return new_signals
def super_position(signals): # наложение полученных отраженных сигналов
res = []
for i in range(len(signals)):
for j in range(len(signals[i].value)):
if len(res) >= signals[i].distance + j:
res.append(signals[i].value[j])
else:
res[signals[i].distance + j] = signals[i].value[j]
return res
t = np.linspace(0, TIME_MAX, N*TIME_MAX)
base_signal = Signal(distance=0)
base_signal.make_signal(FREQUENCY, TIME_MAX, N, AMP)
fourier = np.fft.fft(base_signal.value)
plt.plot(t, base_signal.value)
plt.title('Сигнал')
plt.ylabel('Амплитуда')
plt.xlabel('Время')
plt.xlim([0, 0.001])
plt.show()
# Построение графика преобразования фурье
plt.plot(np.absolute(fourier))
plt.title('Разложение Фурье')
plt.ylabel('Мощность')
plt.xlabel('Частота')
plt.show()
##########################################
echoes = reverberation(10, base_signal)
result = super_position(echoes)
fourier = np.fft.fft(result)
t = np.linspace(0, TIME_MAX, len(result)*TIME_MAX)
plt.plot(t, result)
plt.title('Сигнал')
plt.ylabel('Амплитуда')
plt.xlabel('Время')
#plt.xlim([0, 0.001])
plt.show()
# Построение графика преобразования фурье
plt.plot(np.absolute(fourier))
plt.title('Разложение Фурье')
plt.ylabel('Мощность')
plt.xlabel('Частота')
plt.show()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment