scipy.io.wavfile.write без звука - PullRequest
0 голосов
/ 28 июня 2018

Я хочу записать сигнал в файл .wav, но когда я делаю это, используя scipy.io.wavfile.write, просто создайте мне .wav без звука. .WAV имеет хорошую длину, но нет звука. Я искал решение этой проблемы, но не мог найти помощь. Мой код ниже:

import scipy as sp import numpy as np dt = np.dtype(np.int32) sig = np.fromfile(filename, dtype=dt, count=-1, sep='') sp.io.wavfile.write('sound.wav', int(fS), sig)

В качестве теста я также выполнил небольшую функцию:

    def write_wav_sin(name,fs,f):
        x = np.linspace(0,10,10*fs)
        dt = np.dtype(np.float32)
        sig = np.sin(2*math.pi*f*x, dtype=dt)
        print(type(sig[0]))
        sp.io.wavfile.write(name, fs, sig) 
        plt.plot(x,sig)

С этим тестом он работает, но с другим моим кодом он не работает

Кто-то знает, почему у меня такая проблема?

Ответы [ 3 ]

0 голосов
/ 28 июня 2018

Проверьте диапазон значений в sig, напечатав sig.min() и sig.max(). Значения не масштабируются на wavfile.write, поэтому возможно, что у вас есть файл со значениями настолько низкими, что вы не можете их услышать.

Попробуйте увеличить 32-разрядные целочисленные значения или записать данные как нормализованные 32-разрядные числа с плавающей запятой. Например, это преобразует sig в 32-битные значения с плавающей запятой в диапазоне [-1, 1] перед сохранением:

m = np.max(np.abs(sig))
sigf32 = (sig/m).astype(np.float32)
sp.io.wavfile.write('sound.wav', int(fS), sigf32)
0 голосов
/ 28 июня 2018

Наконец, я разделил весь свой сигнал, чтобы его максимальная амплитуда была намного меньше (у моего сигнала иногда была амплитуда 500000, чтобы записать его в формате Wav, я разделил его на 250000).

С помощью этого трюка я могу слушать звук, но есть что-то странное, например, дополнительные артефакты / шум (я сравнил его с .wav, полученным с помощью matlab, с тем же файлом)

код, который я использовал:

    import scipy as sp
    import numpy as np
    dt = np.dtype(np.int32)
    sig = np.fromfile(filename, dtype=dt, count=-1, sep='')
    sp.io.wavfile.write('sound.wav', int(fS), sig/250000)
0 голосов
/ 28 июня 2018

Вот прокомментированный пример того, как сгенерировать основной волновой файл с заданной длительностью, частотой, объемом и количеством сэмплов. Использование NumPy и библиотеки Python wave.

import numpy as ny
import struct
import wave


class SoundFile:
   def  __init__(self, signal):
       # https://docs.python.org/3.6/library/wave.html#wave.open
       self.file = wave.open('test.wav', 'wb')
       self.signal = signal
       self.sr = 44100

   def write(self):
       # https://docs.python.org/3.6/library/wave.html#wave.Wave_write.setparams
       self.file.setparams( ( 1, 2, self.sr, 44100 * 4, 'NONE', 'noncompressed' ) )
       # https://docs.python.org/3.6/library/wave.html#wave.Wave_write.writeframes
       self.file.writeframes( self.signal )
       self.file.close()

# signal settings
duration = 4 # duration in Seconds
samplerate = 44100 # Hz (frequency) 
samples = duration * samplerate # aka samples per second
frequency = 440 # Hz
period = samplerate / float( frequency ) # of samples
omega = ny.pi * 2 / period # calculate omega (angular frequency)
volume = 16384 # 16384 is the volume measure (max is 32768)

# create sin wave
xaxis = ny.arange( samples, dtype = ny.float )
ydata = volume * ny.sin( xaxis * omega )

# fill blanks
signal = ny.resize( ydata, ( samples, ) )

#create sound file
f = SoundFile( signal )
f.write()

print( 'sound file created' )

Постарался прокомментировать, обновить и изменить этот источник от случайного блоггера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...