Я слышу шум только после взятия БПФ и изменения значений частотных составляющих. Куда я иду не так? - PullRequest
0 голосов
/ 12 ноября 2018

Цель моего проекта - синтезировать звук. Я хочу прочитать волновой файл и преобразовать его в амплитудный спектр. Так как меня интересуют величина и соответствующие частоты. Мне также нужно изменить амплитуду определенных частот (которые я получаю), чтобы я мог генерировать различные звуки wav-файла и воспроизводить его. Однако даже без изменения величины восстановленный сигнал полон шумов.

Проще говоря, прочитайте файл --- FFT --- измените величину --- воспроизведите его.

ниже код

import scipy.io.wavfile
import sounfile as sf
data , rate = sf.read("bird_chirp.wav")
FFt_data =np.fft.rfft(data)
magnitude = np.abs(FFt_data)
phase = np.angle(FFt_data)
N= len(data) # Define the length of the wav file
timestamp = np.linspace(0.0, N*T, N)
T= 1.0/rate
n = data.size


#get the corresponding Frequencies
freq = np.fft.rfftfreq(n, d=1./rate)


# save it as a Dataframe
df = {"freq":freq, "mag":magnitude}
df =pd.DataFrame(df)


#Normalize the magnitude
a=df["mag"]
norm_a = a/a.max(axis=0)
df["mag"] = norm_a


# here I would play around with magnitude , make it high or low
#code to change magnitude

#Get back the new data to write in wav
y=0
for magnitudes ,frequencies in df.iterrows():
   y+= magnitudes["mag"]*(np.sin(frequencies["freq"] *2.0*np.pi*timestamp)) 


#save it 
sf.write(file="test.wav", data=y,samplerate=rate)

Код воспроизводит звук, полный шума.

1 Ответ

0 голосов
/ 13 ноября 2018

Ниже приведена простая программа, которая (а) читает волновой файл, (б) Фурье преобразует данные, (в) изменяет амплитуды на определенных частотах, (г) обращает преобразование Фурье, чтобы преобразовать данные обратно во временную областьи (e) сохраняет результат в другой волновой файл, который вы можете воспроизвести с помощью любой из обычных программ воспроизведения звука.

В целях демонстрации того, что вы можете сделать с сигналом простым способом, мы ослабляемамплитуду на частоте 1 кГц, мы добавляем непрерывный тон на частоте 440 Гц и добавляем импульс гауссовой формы на частоте 880.

Обратите внимание, что введенные сигналы масштабируются до максимума других сигналов в преобразовании Фурье.В качестве альтернативы мы могли бы выбрать амплитуду и масштабировать ее по длине данных.

Важной концепцией здесь является то, что преобразование Фурье сохраняет мощность.Поэтому сигнал в преобразовании Фурье масштабируется по его длительности во времени.

Вот код для реализации того, что вы, казалось, искали в вопросе:

import scipy.io.wavfile
import soundfile as sf

import numpy as np

# Input the wave file
data , rate = sf.read("bird_chirp.wav")

# Fourier transform
FFT_data = np.fft.rfft(data)

# Get the list of frequencies
freq = np.fft.rfftfreq(len(data), d=1./rate)

# Find the bin closest to 1kHz and attenuate
idx = (np.abs(freq - 1.E3)).argmin()
FFT_data[idx] *= 1./2

# Find the bin closest to 440 Hz and set a continuous tone
idx = (np.abs(freq - 440)).argmin()
FFT_data[idx] = max( abs( FFT_data) )

# Add a Gaussian pulse, width in frequency is inverse of its duration
FFT_data += max( abs( FFT_data) )/2. * np.exp( -((freq-880)/5.)**2 )

# Convert back to time domain
newdata = np.fft.irfft(FFT_data)

# And save it to a new wave file
sf.write(file="test.wav", data=newdata, samplerate=rate)
...