2013-03-12 2 views
2

Я пытаюсь написать аудиофайл с тонами от 440 до 600 Гц. Файл должен начинаться с 440 Гц, а затем воспроизводить каждую частоту (в порядке возрастания) в течение 1 секунды, заканчиваясь на 600 Гц. Я придумал волновой модуль python, но здесь я делаю что-то неправильно, так как в итоге у меня есть файл без звука. (Если у кого-то есть лучшее предложение, мне действительно все равно, находится ли он на питоне или нет. Я использую Linux, и все, что будет работать на этой платформе, будет хорошо. Мне просто нужно создать аудиофайл с вышеуказанными спецификациями. thx!)Как написать многочастотный звуковой файл?

frequencies = range(440,600) 
data_size = len(frequencies) 
fname = "WaveTest.wav" 
frate = 11025.0 # framerate as a float 
amp = 64000.0  # multiplier for amplitude 

sine_list_x = [] 
for f in frequencies: 
    for x in range(data_size): 
     sine_list_x.append(math.sin(2*math.pi*f*(x/frate))) 

wav_file = wave.open(fname, "w") 

nchannels = 1 
sampwidth = 2 
framerate = int(frate) 
nframes = data_size 
comptype = "NONE" 
compname = "not compressed" 

wav_file.setparams((nchannels, sampwidth, framerate, nframes, 
    comptype, compname)) 

for s in sine_list_x: 
    # write the audio frames to file 
    wav_file.writeframes(struct.pack('h', int(s*amp/2))) 

wav_file.close() 

ответ

1

Что-то вроде этого должно работать: надеюсь, это, по крайней мере, хорошая отправная точка для продолжения.

import numpy as N 
import wave 

towrite = '' 
for freq in xrange(440,600): 
    duration = 1 
    samplerate = 44100 
    samples = duration*samplerate 
    period = samplerate/float(freq) # in sample points 
    omega = N.pi * 2/period 

    xaxis = N.arange(samples,dtype = N.float) 
    ydata = 16384 * N.sin(xaxis*omega) 

    signal = N.resize(ydata, (samples,)) 

    towrite += ''.join([wave.struct.pack('h',s) for s in signal]) 

f = wave.open('freqs.wav', 'wb') 
f.setparams((1,2,44100, 44100*4, 'NONE', 'noncompressed')) 
f.writeframes(towrite) 
f.close() 

Reference

1

Это, кажется, работает хорошо для меня на цех изготовления печатных форм Windows:

start of the signal at 440 Hz

end of the signal at 600 Hz

Выборка уважается и частоты впору (от От 440 до 600 Гц). Однако в вашем коде частоты не остаются на одну секунду, а для len (frequency)/frate-th секунды. Если вы хотите иметь полную секунду для каждой частоты, data_size должен быть равен frate.

import math 
import wave 
import struct 

frequencies = range(440,600) 
duration = 1 #in second 
fname = "WaveTest.wav" 
frate = 11025.0 # framerate as a float 
amp = 64000.0  # multiplier for amplitude 

sine_list_x = [] 
for f in frequencies: 
    for x in range(duration*frate) : 
     sine_list_x.append(math.sin(2*math.pi*f*(x/frate))) 

wav_file = wave.open(fname, "w") 

nchannels = 1 
sampwidth = 2 
framerate = int(frate) 
nframes = data_size 
comptype = "NONE" 
compname = "not compressed" 

wav_file.setparams((nchannels, sampwidth, framerate, nframes, 
    comptype, compname)) 

for s in sine_list_x: 
    # write the audio frames to file 
    wav_file.writeframes(struct.pack('h', int(s*amp/2))) 

wav_file.close()