Last active
May 27, 2019 06:49
-
-
Save unanoc/2494f93df6e4f7a71843a9c68b560b55 to your computer and use it in GitHub Desktop.
reverbation signals
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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