使用numpy进行简单卷积的意外结果

丹尼尔

我已经有一段时间没有做过DSP了,但是我没想到我对基本知识的掌握会走这么远。我有一个脚本,在其中将复杂的指数音调进行卷积。我希望其结果是转移的语气。我的结果是非常出乎意料的-我得到3种音调,但没有一个达到我期望的频率。有人可以解释为什么我得到这些结果吗?

这是脚本。

import sys
import numpy
import math
import scipy
from pylab import *

def gen_tone(f, fs, length):
    t = linspace(0, length, length * fs)
    return cos(2.0 * pi * f * t)

def gen_exp(f, fs, length):
    t = linspace(0, length, length * fs)
    return numpy.exp(1.0j * 2 * pi * f * t)

def plot_fft(f, fs):
    FFT = abs(scipy.fft(f, 1024)) / f.size
    figure()
    plot(FFT)

f100 = gen_tone(8000, 44100, 1)
f200j = gen_exp(1000, 44100, 1)

res = scipy.signal.fftconvolve(f100, f200j, 'full')

plot_fft(f100, 44100)
plot_fft(f200j, 44100)
plot_fft(res, 44100)

show()
沃伦·韦克瑟(Warren Weckesser)

您正在使用频移属性(例如,请参见http://ocw.usu.edu/Electrical_and_Computer_Engineering/Signals_and_Systems/5_6node6.html;向下滚动到标有“频移属性”的部分。)即,如果的傅立叶变换f(t)F(w),则进行傅立叶变换。的f(t)*exp(j*w0*t)F(w - w0)表达f(t)*exp(j*w0*t)是逐点相乘f(t)exp(j*w0*t)卷积。

要查看您期望的结果,请替换为:

res = scipy.signal.fftconvolve(f100, f200j, 'full')

res = f100 * f200j

如果您按以下方式修改绘图功能,则更容易看到结果:

def plot_fft(f, fs):
    FFT = abs(fft(f, 1024)) / f.size
    freq = fftfreq(1024, 1.0/fs)
    ndx = freq.argsort()
    figure()
    plot(freq[ndx], FFT[ndx])
    grid(True)

并添加

from scipy.fftpack import fft, fftfreq

在脚本的顶部。

您会看到,在的FFT图中的-8000和8000处的峰在的FFT图f100中移至-7000和9000 res

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章