Ниже приведена простая программа, которая (а) читает волновой файл, (б) Фурье преобразует данные, (в) изменяет амплитуды на определенных частотах, (г) обращает преобразование Фурье, чтобы преобразовать данные обратно во временную областьи (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)