Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 现有(合成)信号和滤波信号之间的FFT振幅差异较大_Python_Scipy_Fft_Digital Filter - Fatal编程技术网

Python 现有(合成)信号和滤波信号之间的FFT振幅差异较大

Python 现有(合成)信号和滤波信号之间的FFT振幅差异较大,python,scipy,fft,digital-filter,Python,Scipy,Fft,Digital Filter,我认为,在滤波信号的FFT图上,噪声区域的振幅应该更低,那么现在。可能是scipy.fftpack.lfilter()中出现的小数值偏差/错误 我试图给现有信号添加噪声,但没有结果 为什么噪声区域中滤波信号(绿色)的FFT振幅如此高 更新: FFT振幅的300 dB是非物理的-很明显,这是由于Python环境中的64位浮点运算造成的 滤波信号(绿色)的FFT具有如此低的dB(约67 dB),因为所有信号都有约4000个样本(不是图片上的“每秒”,错误很小,不严重),采样率=200个样本/秒。1

我认为,在滤波信号的FFT图上,噪声区域的振幅应该更低,那么现在。可能是
scipy.fftpack.lfilter()
中出现的小数值偏差/错误

我试图给现有信号添加噪声,但没有结果

为什么噪声区域中滤波信号(绿色)的FFT振幅如此高

更新:
FFT振幅的300 dB是非物理的-很明显,这是由于Python环境中的64位浮点运算造成的

滤波信号(绿色)的FFT具有如此低的dB(约67 dB),因为所有信号都有约4000个样本(不是图片上的“每秒”,错误很小,不严重),采样率=200个样本/秒。1个频率槽=200/4000/2=0.025Hz,显示2000个频率槽

如果我们获取更长的信号,我们可以获得每个bin更高的频率分辨率(即40000个样本,1个频率bin=200/40000/2=0.0025 Hz)。我们还得到了一个滤波信号的FFT~87 dB

(数字67 dB和87 dB似乎是非物理的,因为初始信号SNR为300dB,但我尝试向现有信号添加一些噪声,并获得相同的数字)

如果您想获得与信号中采样数无关的FFT图像,则应使用加窗FFT和滑动窗口来计算整个信号FFT

“”
创建于2013年2月13日,python 2.7.3
@作者:
'''
从numpy.random导入普通
从numpy输入sin、pi、绝对、arange、round
#从numpy.fft导入fft
从scipy.fftpack导入fft,ifft
来自scipy.signal import kaiserord、firwin、lfilter、freqz
从pylab导入图形、clf、plot、xlabel、ylabel、xlim、ylim、标题、网格、轴、显示、log10\
子批次\u调整,子批次
def过滤器应用(文件名):
通过
def sin_发生器(频率=1000,采样率=8000,振幅=1.0,时间=1):
nsamples=四舍五入(采样率*时间)
t=arange(nsamples)/float(采样率)
信号=振幅*sin(2*pi*freq\u hz.\uu\u float\uu()*t)
返回信号
def do_fir(信号、采样率):
返回信号
#-----------------发出信号---------------
频率=10.0
采样率=400
振幅=1.0
时间=10
a1,nsamples=正弦发生器(频率、采样率、振幅、时间)
a2,nsamples=正弦发生器(50.0,采样率,0.5*振幅,时间)
a3,nsamples=正弦发生器(150.0,采样率,0.5*振幅,时间)
μ,σ=0,0.1#平均值和标准偏差
噪声=正常值(μ、sigma、nsamples)
信号=a1+a2+a3+噪声
#----------------创建低通FIR----
#信号的奈奎斯特速率。
纽约市盈率=抽样率/2.0
#从传递到停止的所需过渡宽度,
#相对于奈奎斯特速率。我们将设计过滤器
#具有5 Hz的过渡宽度。
宽度=5.0/nyq_费率
#阻带中所需的衰减,单位为dB。
波纹_db=60.0
#计算FIR滤波器的阶数和Kaiser参数。
N、 贝塔=kaiserord(波纹_db,宽度)
打印“N=”,N,“beta=kaiser参数=”,beta
#滤波器的截止频率。
截止频率=30.0
#使用firwin和Kaiser窗口创建低通FIR滤波器。
#滤波器长度(系数数量,即滤波器阶数+1)
抽头=firwin(N,截止频率/nyq,窗口=('kaiser',beta))
#使用lfilter使用FIR滤波器对x进行滤波。
滤波信号=线性滤波器(抽头,1.0,信号)
#----------------绘图信号----------------------
hh,ww=2,2
图(figsize=(12,9))
子批次调整(hspace=.5)
#图(1)
子地块(hh、ww、1)
#现有信号
x=arange(样本)/浮动(样本率)
#滤波信号的相位延迟。
延迟=0.5*(N-1)/采样率
#原始信号
绘图(x,信号,'-bo',线宽=2)
#滤波信号移位以补偿
#相位延迟。
绘图(x延迟,滤波的_信号,'r-',线宽=1)
#仅绘制滤波信号的“良好”部分。
#前N-1个样本被
#初始条件。
绘图(x[N-1:]-延迟,滤波的_信号[N-1:],'g',线宽=2)
xlabel(“时间”)
ylabel(‘振幅’)
轴([0,1.0/频率*2,-(振幅*1.5),振幅*1.5])两个频率周期
标题(‘信号(%d个样本)’%n样本)
网格(真)
#--------------信号的FFT
子地块(hh、ww、2)
信号\u fft=fft(信号)
滤波的fft=fft(滤波的fft信号[N-1:]
#现有信号
y=20*log10((abs(信号fft/nsamples)*2.0)/max(abs(信号fft/nsamples)*2.0))#dB振幅
x=arange(样本)/浮动(样本)*浮动(样本率)
#滤波信号
y_filtered=20*log10((abs(filtered_fft/(nsamples-N+1))*2.0)/max(abs(signal_fft/(nsamples-N+1))*2.0))dB振幅
x_filtered=arange(nsamples-N+1)/float(nsamples-N+1)*float(采样率)
yy=快速傅里叶变换(ifft(滤波的快速傅里叶变换))
绘图(x,y,线宽=1)
绘图(x_过滤,y_过滤,'g',线宽=2)
xlim(0,采样率/2)#镜像补偿(FFT虚部)
xlabel(‘频率(Hz)’)
ylabel('振幅,(dB)')
标题(‘信号(%d个样本)’%n样本)
网格(真)
#--------------杉木振幅响应
子地块(hh、ww、3)
w、 h=频率(丝锥,磨损=8000)
#绘图((w/pi)*nyq_比率,绝对(h),线宽=2)
绘图((w/pi)*nyq_比率,20*log10(绝对(h)/1.0),'r',线宽=1)
xlabel(‘频率(Hz)’)
#ylabel('增益-蓝色')
ylabel('增益(dB)')
标题(“频率响应”)
#ylim(-0.05,1.05)
网格(真)
#--------------杉木系数
子地块(hh、ww、4)
绘图(轻触“bo-”,线宽=2)
标题(‘过滤系数(%d个抽头)’%N)
网格(真)
show()

我想你-300分贝的噪音相当低。请记住,这是一个对数刻度,所以我们讨论的是两个64位分辨率的数字


使用双精度浮点(64位)不会得到更低的精度

我在你产生的频率上看到三个巨大的尖峰。在噪声区域,振幅会降低多少?是的,300dB是“非物理”极限,但如果我添加一些噪声,仍然没有足够的结果。