Как мне избавиться от этого треска/хлопка, когда моя программа обработки сигналов замолкает?Python

Программы на Python
Ответить
Anonymous
 Как мне избавиться от этого треска/хлопка, когда моя программа обработки сигналов замолкает?

Сообщение Anonymous »

Я пишу скрипт Python для генерации различных сигналов с заданной частотой. Для этого я использую библиотеку PyAudio (оболочку для PortAudio языка C) для вывода звука на основе 8-битных целых чисел. Фактически звук работает прекрасно, возможно, за парой исключений, которые мне здесь не интересны.
Проблема в том, что при запуске или завершении программы слышен громкий хлопок/треск. Я читал, что это может быть вызвано внезапным изменением громкости, но мои попытки снизить громкость в ожидании завершения работы программы либо не помогли, либо активно усугубили проблему.
Я включил свой исходный код ниже. Что является причиной шума? Это какая-то более глубокая проблема с PyAudio, которая не была обновлена? Это мой метод хранения значений интенсивности? Есть ли библиотечный конфликт? Не пропустил ли я здесь какой-то важный шаг?
import pyaudio
import random
import pygame
import copy
pygame.init()

framerate = 60
frequency = 440 #Hertz (Oscillations per Second)
samplerate = 16000 #Samples Per Second
volume = 4 #out of 256

SPU = samplerate//framerate #Samples Per Update
SPO = samplerate//frequency #Samples Per Oscillation

#0: Pulse Wave
#1: Triangle Wave
#2: Sawtooth Wave
#3: Noise
mode = 0

lastvalue = 0
gentimer = 0
pulseswitch = 1
tritone = 0
noisemode = False
noisetimer = 0

timer = pygame.time.Clock()
window = pygame.display.set_mode((100,200))
speaker = pyaudio.PyAudio()
channel = speaker.open(format=pyaudio.paUInt8,frames_per_buffer=SPU,channels=1,rate=samplerate,output=True)
data = bytearray()
lastdata = bytearray()

killtimer = -1
while True:
events = pygame.event.get()
for event in events:
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_1:
mode = 1
elif event.key == pygame.K_2:
mode = 2
elif event.key == pygame.K_3:
mode = 3
elif event.key == pygame.K_0:
mode = 0
elif event.key == pygame.K_m:
if noisemode:
noisemode = False
else:
noisemode = True
elif event.key == pygame.K_SPACE:
frequency = 261.6256
SPO = samplerate//frequency
gentimer = 0
elif event.type == pygame.KEYUP:
if event.key == pygame.K_SPACE:
frequency = 440
SPO = samplerate//frequency
gentimer = 0
elif event.type == pygame.QUIT:
killtimer = 20
if mode == 0:
for frame in range(SPU):
gentimer += 1
if gentimer >= (samplerate/frequency)/2:
gentimer = gentimer - ((samplerate/frequency)/2)
if pulseswitch == 1:
pulseswitch = 0
else:
pulseswitch = 1
data.append(int(volume*pulseswitch/2))
elif mode == 1:
for frame in range(SPU):
gentimer += (1-2*pulseswitch)
if gentimer >= (samplerate/frequency)/2:
gentimer = ((samplerate/frequency))-gentimer
pulseswitch = 1
elif gentimer < 0:
gentimer = -gentimer
pulseswitch = 0
tritone = gentimer/((samplerate/frequency)/2)
data.append(int(volume*tritone))
elif mode == 2:
for frame in range(SPU):
gentimer += 1
if gentimer >= (samplerate/frequency):
gentimer = gentimer-(samplerate/frequency)
#print(gentimer)
tritone = gentimer/(samplerate/frequency)
data.append(int(volume*tritone))
elif mode == 3:
for frame in range(SPU):
gentimer += 1
if gentimer >= (samplerate/frequency):
gentimer = 0
if noisemode:
noisetimer += 1
if noisetimer >= 31:
noisetimer = 0
random.seed(0)
tritone = random.randint(0,255)/255
data.append(int(volume*tritone))
channel.write(bytes(data))
data = bytearray()
timer.tick(framerate)
if killtimer != -1:
volume = volume*0.9
if volume < 0.1:
break
channel.stop_stream()
channel.close()
speaker.terminate()


Подробнее здесь: https://stackoverflow.com/questions/799 ... oes-silent
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»