Я пытался загрузить волновой файл и распечатать его спектр с помощью преобразования Фурье. Я последовал за какой-то книгой, которую нашел, и получил оттуда код, но результат немного другой.
def read_wave(filename):
fp=wave.open(filename,'r')
nchannels=fp.getnchannels()
framerate=fp.getframerate()
nframes=fp.getnframes()
sampwidth=fp.getsampwidth()
z_str=fp.readframes(nframes)
fp.close()
dtype_map = {1:np.uint8,2:np.uint16}
ys=np.frombuffer(z_str,dtype=dtype_map[sampwidth])
waveObject=Wave(ys,framerate=framerate)
return waveObject
class Wave:
def __init__(self,ys,ts=None,framerate=None):
# ys:wave array
# ts:array of time
self.ys=np.asanyarray(ys)
self.framerate=framerate
if ts is None:
self.ts =np.arange(len(ys))/self.framerate
else:
self.ts=ts
def make_spectrum(self):
n=len(self.ys);
d=1/self.framerate;
hs = np.fft.rfft(self.ys)
fs = np.fft.rfftfreq(n, d)
return Spectrum(hs,fs,self.framerate)
class Spectrum:
def __init__(self,hs,fs,framerate):
# hs : array of amplitudes (real or complex)
# fs : array of frequencies
self.hs=np.asanyarray(hs)
self.fs=np.asanyarray(fs)
self.framerate=framerate
@property
def amps(self):
return np.absolute(self.hs)
def plot(self, high=None):
plt.plot(self.fs, self.amps)
data=read_wave('hate.wav') <br>
spectrum=data.make_spectrum()<br>
spectrum.plot()<br>
Но спектр, который я получаю, выглядит так, и не выглядит правильным, какая-нибудь помощь?







Имеется огромный пик на ж = 0, который указывает, что сигнал имеет постоянное смещение.
Это может быть связано с использованием беззнаковых целочисленных типов:
dtype_map = {1:np.uint8,2:np.uint16}
Попробуйте использовать знаковый тип или вычтите из сигнала среднее значение, чтобы удалить смещение.
Я пытаюсь скопировать это, что мне нужно изменить в вашем коде, чтобы он заработал?
8-битные отсчеты без знака, хранящиеся в файлах WAVE, находятся в диапазоне от 0 до 255 и, следовательно, имеют смещение по постоянному току. Ваш БПФ показывает это смещение постоянного тока с огромным всплеском в начале. Вычитание смещения постоянного тока (должно быть 128 или значение где-то около 128 из-за ошибок записи) из каждой выборки удалит огромный всплеск смещения постоянного тока из БПФ и позволит автоматизировать масштабирование графика, чтобы лучше показать другие элементы разрешения по частоте.
16-битные выборки в файлах WAVE имеют формат целого числа со знаком, поэтому чтение их как значений без знака может привести к повреждению данных.
Ага, это была проблема. Использование подписанного типа решило это, спасибо.
Ага, это была проблема. Использование подписанного типа решило это, спасибо.