# 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 计算 出其振幅谱,并将结果显示出来。