Я пишу скрипт 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
Как мне избавиться от этого треска/хлопка, когда моя программа обработки сигналов замолкает? ⇐ Python
Программы на Python
1773042012
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()
Подробнее здесь: [url]https://stackoverflow.com/questions/79903506/how-do-i-get-rid-of-this-crackle-pop-noise-when-my-waveform-program-goes-silent[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия