【问题标题】:Gaussian wave generation with a given central frequency具有给定中心频率的高斯波生成
【发布时间】:2016-05-14 16:53:17
【问题描述】:

高斯波的公式是 1/[sqrt(2* pi* 方差)]*exp{-[(x-xo).^2/(2*方差)]};

这个问题分为三个部分:

1) 如何生成具有给定中心频率的时域高斯信号。

(我试图通过改变“方差”值来控制它,但这是一种试错法。有没有其他简单的方法来实现它。)

2) 我的第二个问题是确定它的频谱。

(我在时域中生成一个高斯信号,并使用 FFT 对其进行傅立叶变换。问题是所有频率都分布在零赫兹附近,而不是围绕中心频率。)

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% test for gausssian signal ; Time to Freq
% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
dt=.0001;
fs=1/dt; %sampling frequency
fn=fs/2;
n=1000;
t=dt*(-n/2:n/2); %time base

sigma=0.001;     variance=sigma^2;

xt=1/(sqrt(2*pi*variance))*(exp(-t.^2/(2*variance)));
subplot(2,1,1); plot(t,xt,'b'); 
title(['Gaussian Pulse \sigma=', num2str(sigma),'s']);
xlabel('Time(s)'); ylabel('Amplitude');

xf = fftshift(fft(xt));
f = fs*(-n/2:n/2)/(n/2); %Frequency Vector
subplot(2,1,2); plot(f,xf.*conj(xf),'r'); title('Magnitude of FFT');      
xlabel('Frequency (Hz)'); ylabel('Magnitude |X(f)|');

3) 作为反向练习,我定义了给定频率附近的频谱,然后估计了幅度谱。我改变了中心频率 f0,发现脉冲宽度没有改变。原则上,如果有更高的频率,宽度应该会改变。

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% test for gausssian signal ; Freq --> Time --> Freq
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
clc;  clear all;

dt=0.001;
fs=1/dt; %sampling frequency
fn=fs/2;
n=200;  % provide a even no

f=1/dt*(-n/2+1:n/2-1)/(n/2); %time base

f0=800 ;  % properties of source: position
sigma=20;     % properties of source: width
variance = sigma^2;

xf=1/(sqrt(2*pi*variance))*(exp(-((f-f0).^2/(2*variance))));
figure(1); subplot(3,1,1); plot(f,xf,'b'); 
title(['Gaussian Pulse \sigma=', num2str(sigma),'s']);
xlabel('Freq');   ylabel('Amplitude');

xt=fftshift(ifft(xf));
t=1/fs*(-n/2+1:n/2-1)/(n/2);
subplot(3,1,2); plot(t,xt.*conj(xt),'b'); 
xlabel('Time(s)');   ylabel('Amplitude');

xtf=(fft((fftshift(xt))));
subplot(3,1,3); plot(f,xtf.*conj(xtf),'b'); 
xlabel('Freq');   ylabel('Amplitude')

【问题讨论】:

    标签: matlab signal-processing fft gaussian ifft


    【解决方案1】:

    正如我在post 中指出的那样,要将高斯脉冲调制到更高的频率(并保持信号为实值),您需要将信号乘以 cos(2*pi*t*f0)

    dt=.0001;
    fs=1/dt; %sampling frequency
    fn=fs/2;
    n=1000;
    t=dt*(-n/2:n/2); %time base
    
    sigma=0.001;     variance=sigma^2;
    
    f0 = 1000;
    xt=cos(2*pi*t*f0) .* (exp(-t.^2/(2*variance)))/sqrt(2*pi*variance);
    subplot(2,1,1); plot(t,xt,'b'); 
    title(['Gaussian Pulse \sigma=', num2str(sigma),'s']);
    xlabel('Time(s)'); ylabel('Amplitude');
    axis([-0.02 0.02]);
    
    xf = fftshift(fft(xt));
    f = fs*(-n/2:n/2)/n; %Frequency Vector
    subplot(2,1,2); plot(f,abs(xf),'r'); title('Magnitude of FFT');      
    xlabel('Frequency (Hz)'); ylabel('Magnitude |X(f)|');
    

    这应该会给你类似的结果:

    【讨论】:

    • 感谢您的回答@SleuthEye。正如帖子 (earthscience.stackexchange.com/questions/7463/…) 中提到的,原始高斯波的直流电平不为零,这就是为什么它在我的结果中显示为零附近的峰值。您建议通过将高斯与“cos”因子相乘来移动高斯的方法使波直流电平为零。然而,它改变了不需要的原始波形。保持初始波形完整的任何建议。
    • 具有方差参数的时域高斯脉冲族是以 0Hz 为中心的频域高斯脉冲(如您所见)。在频域中更改它(以具有不同的中心频率),也将在时域中更改它。也就是说,要摆脱 0Hz,您可以使用 y = y-mean(y) 将最终输出通过陷波滤波器。但通常你会想要摆脱 0Hz 左右的频率(不仅仅是 0Hz),所以这不是一个真正的选择。在这种情况下,您必须重新考虑您的要求以及为什么调制脉冲不适合您。
    • 如果我们想用有限带宽(f0f1)而不是单色的cos(2*pi*t*f0) 调制高斯呢?
    • @Lee cos(2*pi*t*f0) 术语将具有有限带宽和中心频率为 0Hz 的高斯移动到中心频率f0。如果您想要一个带宽从f0f1(中心在(f0+f1)/2)的单个高斯,您可以将sigma 设置为具有所需宽度的高斯(频率的+/- 3 个标准偏差域,将sigma 设置为(3/pi)*(1/(f1-f0))),然后通过在时域中乘以cos(2*pi*t*(f0+f1)/2) 将其中心移动到(f0+f1)/2
    猜你喜欢
    • 2012-09-02
    • 1970-01-01
    • 2015-11-27
    • 2021-03-05
    • 1970-01-01
    • 1970-01-01
    • 2012-12-04
    • 2020-07-16
    相关资源
    最近更新 更多