在进行 FFT 和改变频率分量值之后,我只会在音频中得到噪音。我哪里错了?
Posted
技术标签:
【中文标题】在进行 FFT 和改变频率分量值之后,我只会在音频中得到噪音。我哪里错了?【英文标题】:I only get noise in the audio after taking a FFT and varying frequency component values . Where am I going wrong? 【发布时间】:2018-11-12 19:53:15 【问题描述】:我的项目的目标是合成声音。我想要做的是读取一个波形文件并将其转换为幅度谱。因为我对幅度和相应的频率感兴趣。我还需要更改某些频率的幅度(我得到的),以便我可以生成不同的声音 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)
代码播放充满噪音的声音。
【问题讨论】:
如果您希望人们能够提供帮助,我建议您使您的代码更清晰一些 - 例如,使用名称不言自明的变量。此外,您要问什么也不是很清楚-也许扩展您正在尝试做的事情,不起作用的事情以及到目前为止您尝试过的事情?我建议您查看本网站上的指南,了解如何提出人们想要帮助回答的问题。 @RandomDavis 我希望我现在已经给出了更清楚的解释? 当然。您可能只是想进一步澄清您的问题 - 您是在问为什么输出中有噪音,以及如何摆脱它?如果是这样,您应该在帖子的标题和正文中提出该问题,而不是隐含的问题。 ***.com/questions/10222812/…的可能重复 不!幅度没有修改。 【参考方案1】:下面是一个简单的程序,(a) 读取波形文件,(b) 傅里叶变换数据,(c) 修改特定频率的幅度,(d) 反转傅里叶变换以将数据转换回时域,并且 (e) 将结果保存到另一个波形文件中,您可以使用任何常用的音频播放程序进行播放。
为了以简单的方式演示您可以使用信号做什么, 我们在 1 kHz 处衰减幅度,在 440 Hz 处添加连续音调,在 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)
【讨论】:
这真的很有帮助,正是我想要的。但我无法理解衰减和连续音。你为什么要这样写?你能让我明白这两件事吗 另外,您能否给我一个提示,告诉我如何更改 n 个频率的幅度,将相应的幅度放在 excel 表中并更改或其他什么好? 您可以根据需要更改任意多个频率的幅度。请记住,傅里叶空间中的宽度是其持续时间的倒数。我可以添加一些东西来展示这一点。 会很棒!以上是关于在进行 FFT 和改变频率分量值之后,我只会在音频中得到噪音。我哪里错了?的主要内容,如果未能解决你的问题,请参考以下文章