# FFT卷积的速度比较
相关文档: [_频域信号处理_](21)
直接卷积的复杂度为O(N*N),FFT的复杂度为O(N*log(N)),此程序分别计算直接卷积和快速卷积的耗时曲线。请注意Y轴为每点的平均运算时间。
![](https://oss.showapi.com/doc/2125/35/59ab9310-5c4c-4db5-acb2-b902e1eeea6b.png)
# -*- coding: utf-8 -*-
import numpy as np
import timeit
def fft_convolve(a,b):
n = len(a)+len(b)-1
N = 2**(int(np.log2(n))+1)
A = np.fft.fft(a, N)
B = np.fft.fft(b, N)
return np.fft.ifft(A*B)[:n]
if __name__ == "__main__":
from pylab import *
n_list = []
t1_list = []
t2_list = []
for n in xrange(4, 14):
N = 2**n
count = 10000**2 / N**2
if count > 10000: count = 10000
setup = """
import numpy as np
from __main__ import fft_convolve
a = np.random.rand(%s)
b = np.random.rand(%s)
""" % (N, N)
t1 = timeit.timeit("np.convolve(a,b)", setup, number=count)
t2 = timeit.timeit("fft_convolve(a,b)", setup, number=count)
t1_list.append(t1*1000/count/N)
t2_list.append(t2*1000/count/N)
n_list.append(N)
figure(figsize=(8,4))
plot(n_list, t1_list, label=u"直接卷积")
plot(n_list, t2_list, label=u"FFT卷积")
legend()
title(u"卷积的计算时间")
ylabel(u"计算时间(ms/point)")
xlabel(u"长度")
xlim(min(n_list),max(n_list))
show()
# FFT卷积的速度比较相关文档: [_频域信号处理_](21)直接卷积的复杂度为O(N*N),FFT的复杂度为O(N*log(N)),此程序分别计算直接卷积和快速卷积的耗时曲线。请注意Y轴为每点的平均运算时间。![](https://oss.showapi.com/doc/2125/35/59ab9310-5c4c-4db5-acb2-b902e1eeea6b.png)```# -*- codi...
1. 前言
傅立叶变换具有
卷积
的性质,因此可以使用傅立叶变换实现数据
卷积
处理。图像的傅立叶变换可以参考这里:数字图像处理与
Python
实现-图像变换-傅立叶变换
2. 傅立叶
卷积
性质数学表示
如果f(x)f(x)f(x)和g(x)g(x)g(x)为两个一维时域函数;f(x,y)f(x,y)f(x,y)和g(x,y)g(x,y)g(x,y)为两个二维空域函
最近使用到DFT,自己编写DFT
计算
效率极低,故选择使用高效的
FFT
W
库
,同时测试自己使用编写C语言DFT,MATLAB脚本DFT与
FFT
W
库
耗时对比。(代码太乱,就不贴代码了,有疑问可以留言探讨)
1.
FFT
W
库
耗时对比:
在C++中调用
FFT
W
库
耗时在6~4ms区间波动(图2),其中统计时间使用time.h中clock()函数。
此方法是借用另外一位网友的博客https://www.cnblogs.com/zillyrex/p/11802833.html
转载请标明是引用于 http://blog.csdn.net/chenyujing1234
例子代码:(编译工具:VS2005)
http://www.rayfile.com/zh-cn/files/76968e5e-7bde-11e1-8c13-0015c55db73d/
由于公司要
做
FFT
算法,具体是
做
高尔夫球的弹道分析,至今还没把算法敲定。
今天网上看了算法,自己建立工程,进行了比
傅里叶变换或者
FFT
的理论参考:
[1]http://www.dspguide.com/ch12/2.htm
The Scientist and Engineer's Guide toDigital Signal Processing, By
Steven W. Smith, Ph.D.
[2]http://blog.csdn.net/v_JULY_v/article/details...
相关文章:傅立叶级数展开初探(
Python
)这里
做
一下记录,关于
FFT
就不
做
介绍了,直接贴上代码,有详细注释的了:import numpy as
np
from scipy.
fft
pack import
fft
,i
fft
import matplotlib.pyplot as plt
import seaborn
#采样点选择1400个,因为设置的信号频率分量最高为600赫兹,根据采样定理知采样频率
说明:本文适合信号处理方面有一定的基础的人阅读,能够理解什么时候傅里叶级数和傅里叶变换,能够理解他们的核心思想以及基本原理,能够理解到底什么是“频率域”,能够从频率的角度分析信号。
一、一些关键概念的引入
1、离散傅里叶变换(DFT)
离散傅里叶变换(discrete Fourier transform) 傅里叶分析方法是信号分析的最基本方法,傅里叶变换是傅里叶分析的核心,通过它把信...
f2 = 20
f3 = 30
signal =
np
.sin(2*
np
.pi*f1*t) + 0.5*
np
.sin(2*
np
.pi*f2*t) + 0.2*
np
.sin(2*
np
.pi*f3*t)
#
计算
FFT
fft
_signal =
np
.
fft
.
fft
(signal)
freq =
np
.
fft
.
fft
freq(len(signal), t[1]-t[0])
#
计算
振幅谱
amp_spectrum =
np
.abs(
fft
_signal)
# 显示分析结果
plt.plot(freq, amp_spectrum)
plt.xlabel('Frequency (Hz)')
plt.ylabel('Amplitude')
plt.show()
这段代码可以生成一个包含三个正弦波的信号,并使用
FFT
计算
出其振幅谱,并将结果显示出来。