【问题标题】:Generate a quasi periodic signal产生准周期信号
【发布时间】:2018-02-04 08:20:48
【问题描述】:

有没有办法生成准周期信号(具有特定频率分布的信号,如正态分布)?此外, 信号不应该有一个平稳的频率分布,因为高斯函数的傅里叶逆变换仍然是一个高斯函数,而我想要的是一个振荡信号。

我使用了一系列离散的正态分布频率来生成信号,即

频率分布如下:

所以在初始阶段

,我收到信号了

但是,信号就像

它的FFT谱就像

我发现最终的频谱只在t=0之后的短时间内类似于高斯函数(对应图中左边几个峰值4非常高),剩下的信号只有导致图5中峰值两侧的毛刺。

我认为问题可能来自初始阶段。我尝试了随机分布的初始阶段,但也没有用。

那么,产生这种信号的正确方法是什么?

这是我的python代码:

import numpy as np
from scipy.special import erf, erfinv
def gaussian_frequency(array_length = 10000, central_freq = 100, std = 10):
    n = np.arange(array_length)
    f = np.sqrt(2)*std*erfinv(2*n/array_length - erf(central_freq/np.sqrt(2)/std)) + central_freq
    return f
f = gaussian_frequency()
phi = np.linspace(0,2*np.pi, len(f))
t = np.linspace(0,100,100000)
signal = np.zeros(len(t))
for k in range(len(f)):
    signal += np.sin(phi[k] + 2*np.pi*f[k]*t)
def fourierPlt(signal, TIMESTEP = .001):
    num_samples = len(signal)
    k = np.arange(num_samples)
    Fs = 1/TIMESTEP
    T = num_samples/Fs
    frq = k/T # two sides frequency range
    frq = frq[range(int(num_samples/2))] # one side frequency range
    fourier = np.fft.fft(signal)/num_samples # fft computing and normalization
    fourier = abs(fourier[range(int(num_samples/2))])
    fourier = fourier/sum(fourier)
    plt.plot(frq, fourier, 'r', linewidth = 1)
    plt.title("Fast Fourier Transform")
    plt.xlabel('$f$/Hz')
    plt.ylabel('Normalized Spectrum')
    return(frq, fourier)
fourierPlt(signal)

【问题讨论】:

    标签: python fft spectrum ifft periodicity


    【解决方案1】:

    如果您希望信号为实值,则需要对频率分量进行镜像:您需要正负频率是彼此的复共轭。我想你已经想到了这一点。

    一个高斯形频谱(平均值在 f=0)产生一个高斯形信号。

    将频谱移动一个频率f0会导致时域信号乘以exp(j 2 π f0t)。也就是说,你只改变它的相位。

    假设您仍需要实值时间信号,则必须复制频谱并在两个方向上移动它。这会导致乘以

    exp(j 2 π f0t)+exp(-j 2 π f0t) = 2 cos(2 π f0t) .

    因此,您的信号是对余弦进行调制的高斯信号。

    我这里用 MATLAB 做例子,希望你能轻松翻译成 Python:

    t=0:300;
    s=exp(-(t-150).^2/30.^2) .* cos(2*pi*0.1*t);
    subplot(2,1,1)
    plot(t,s)
    xlabel('time')
    
    S=abs(fftshift(fft(s)));
    f=linspace(-0.5,0.5,length(S));
    subplot(2,1,2)
    plot(f,S)
    xlabel('frequency')
    

    对于那些对图像处理感兴趣的人:Gabor filter 就是这样,但频谱仅向一个方向移动。得到的过滤器是复杂的,使用过滤结果的大小。这导致了与相位无关的滤波器。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多