首页
学习
活动
专区
圈层
工具
发布

FFT去噪
EN

Stack Overflow用户
提问于 2019-09-11 15:43:22
回答 1查看 724关注 0票数 3

我使用大胆产生一个10赫兹的音调,48千赫采样和1秒的持续时间。然后用下面的脚本加载它来绘制FFT图:

代码语言:javascript
复制
from scipy.io import wavfile
from scipy.fftpack import fft, fftfreq
import matplotlib.pyplot as plt
from pydub import AudioSegment
import numpy as np

wav_filename = "\\test\\10Hz.wav"
samplerate, data = wavfile.read(wav_filename)
total_samples = len(data)
limit = int((total_samples /2)-1)
fft_abs = abs(fft(data))*2/total_samples
fft_db = 20*np.log10(fft_abs/32760)
freqs = fftfreq(total_samples,1/samplerate)
# plot the frequencies
plt.plot(freqs[:limit], fft_db[:limit])
plt.xscale('log',basex=10)
plt.title("Frequency spectrum")
plt.xlabel('Hz')
plt.ylabel('amplitude')
plt.show()

下面是一张嘈杂的图表:

但如果我用胆量来看光谱图,那就很好了。

我应该如何改进我的脚本以获得更好的FFT绘图?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-09-11 20:30:41

这种特殊的频谱模式的WAV文件是由噪声形状抖动应用于减少量化造成的失真。

将信号作为带符号的16位整数存储在WAV文件中.该 量子化 使信号具有相当高的:2^15为32768 : 0.5/32768的相对误差,计算出的可能会使其增加。大约是1e-5,或-96分贝。因此,如果不小心地将信号的值转换为最近的整数,则任何96 of以下的频率都可以被丢弃为量化噪声。

然而,输出的WAV文件的频谱看起来很好,因为所有频率的振幅都低于-100 0dB,唯一的例外是正弦波的频率,它的振幅接近0dB。问题是要重新表述的: Audacity如何才能为WAV文件提供如此精确的频谱?

对输出值进行了优化,以提高频谱的精度。实际上,单个输出值的精度低于将浮点值转换为整数值。我产生了一个幅值为0.8的正弦波,输出为WAV签署的16位PCM。量化误差可计算为:

代码语言:javascript
复制
x=np.linspace(0,1,len(data),endpoint=False)
data2=np.sin(10*2*np.pi*x)

data=data.astype(np.double)
plt.plot(x, data-0.8*32768*data2, label="data-sin(x)")
#plt.xscale('log',basex=10)
plt.title("signal")
plt.xlabel('time, s')
plt.ylabel('amplitude')
plt.show()

生成的量化误差图:

如果简单地将信号值转换为最近的整数并将其倒入WAV文件,则生成的错误将低于0.5。实际的点态误差约为5。

为了提高量化信号的动态范围,增加了一个很难被人类听到的高频噪声,奥迪公司考虑了一种噪声型抖动那里那里那里

,您可以 选择谨慎中的抖动,甚至禁用它。进入Preferences=>质量!如果不考虑抖动,则实际空间中的点态误差更小:

但是光谱上的量化误差更大:

矩形抖动可以用来后退看起来像白噪声的东西:它可能是你使用的最佳选择,因为频谱上的误差约为-125 is,点态误差为+-1。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57892632

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档