【问题标题】:Recovering time function from its single-sided spectrum + its Hermitian从其单面谱+其厄米特恢复时间函数
【发布时间】:2017-10-10 23:19:23
【问题描述】:

我试图从其单面离散傅里叶变换中得到一个真正的小波w,它是一个列向量。根据理论,负频侧是正频侧的复共轭,但是在Matlab中实现它(使用ifft函数)让我很头疼。

下面,我列出了一个小程序,它将阻尼正弦小波w 转换为频域W,然后提取正部分并用conj(flipud(W)) 进行扩充,但它的逆 FFT 看起来就像我的输入小波幅度用其他东西调制一样。但是,w = ifft(W,'symmetric') 工作正常。任何识别问题的建议都将受到高度赞赏。

这里是列表:

clc; clear all
% Genetate a damped sine wavelet
n = 100;
n2 = floor(n/2)+ 1;
dt = .25;
for i  = 1:n
    t = (i-1)*dt;
    w(i,1) = 100 * sin(t) * exp(-0.2*t);
end

figure; subplot(3,2,1);  plot(w);
title('The Signal')
%-------------------------------------
W1  = fft(w);                 % 2-sided
n2 = floor(n/2)+ 1;
W2  = fft(w,n2);              % 1-sided
subplot(3,2,3);plot(real(W2));
title('2-sided abs(W2)')
subplot(3,2,5);plot(imag(W2));
title('2-sided angle(W2)')
%-------------------------------------

w1 = ifft( W1 ) ;                 % Works fine
subplot(3,2,2); plot( w1);
title( ' w2 = ifft(W2);   (2-sided) ' );

% --------------------------------------
% Use the /symmetric/ option of ifft() with
% the single-sided spectrum

w2 = ifft(W2 , 'symmetric');  % 1-sided, works fine

subplot(3,2,4);plot(w2,'k');
title( 'w2 = ifft(W2, "symmetric" )')

% --------------------------------------
% Calculate the complex-cojugate of 1-sided W2
% (excluding the zero frequency point?!), flip it,
% and attach it to the tail of W2 col vector.

H  = flipud(conj(W2(2:n2)));
W3  = [W2 ; H];
w3 = ifft( W3 ) ;    % sourse of my migraine headache
% If you let n =1000 instead of the 100, the effect of
% amplitude-modulation-like effect is less and the output
% (bottom right graph)resembles the input wavelet but
% with a thicker line.
% If n=100 and W2(1:n2-1) in H = ... is used instead
% of the W2(2:n2), you'll get a flying bold eagle!


subplot(3,2,6);plot(w3,'k');
title('w3 = ifft([W2 ; H]')
%---end of the program-------------------

【问题讨论】:

    标签: matlab fft spectrum ifft


    【解决方案1】:

    问题出在这一行:

    W2  = fft(w,n2);              % 1-sided
    

    与隐含的假设不同,这将返回完整 length(w) 大小的 FFT 的第一个 n2 输出(如果是这种情况,它将为您提供预期的单面频谱),此行改为返回完整的序列w 截断为n2 样本的FFT(两侧频谱)。

    然后解决方法是计算 W 的完整 FFT,然后选择结果的第一个 n2 样本,就像更新后的代码一样:

    W1 = fft(w);
    W2 = W1(1:n2);
    

    【讨论】:

      【解决方案2】:

      以下工作,但我还没有弄清楚为什么前一个没有:

      clc; clear all
      
      % Genetate a damped sine wavelet
      n = 101;  n2 = floor(n/2) + 1; dt = 0.25;
      
      t = [(0:1:n-1)*dt]'; w = sin(t).*exp(-0.2*t);
      
      figure; subplot(2,1,1);plot(w); 
      title('The Wavelet')
      
      W1   = fft(w);                % 2-sided
      W2  = W1(1:n2);               % 1-sided
      
      H  = flipud ( conj( W1(2:n2) ) );
      W3 = [W2 ; H];  
      w3 = ifft(W3);                % 2-sided
      
      subplot(2,1,2); plot(w3); 
      title('w3 = ifft( [ W3; H ]')
      
      %---------- end of the program----------
      

      【讨论】:

        【解决方案3】:

        Down 是一开始的示例代码的增强版本。根本问题是关于最后的IFFT。考虑使用 (pi./df) 缩放实部。

        您的“增强代码”如下:

        close all; clear all; clc; 
        
        % Genetate a damped sine wavelet
        n = 512;  n2 = floor(n/2) + 1; dt = 0.25; 
        fs=1/dt;   % Digitised data should ever have a sampling rate -right! 
        
        f=linspace(0,fs,n); % Your frequency axis 
        df=mean(diff(f)); % Your incrementation on the frequency axis
        fc=f(12); % Just to get a monochromatic data in time, frequency is needed    
                  % f(12) just to obey the sampling constraints not more than f(n/2+1)
        
        
        t = [(0:1:n-1)*dt]; w = cos(2.*pi.*fc.*t).*exp(-0.2*t);
        
        figure; subplot(2,1,1);plot(t,w); 
        title('The Wavelet')
        
        W1   = fft(w)./n;                % 2-sided
        W2  = W1(1:n2);               % 1-sided
        
        H  = fliplr (conj(W1(2:n2-1))); % Intended to stick with the data length...
        W3 = [W2 , H];  
        w3 = (pi./df).*real(ifft(W3));                % 2-sided (see the scaling)
        
        subplot(2,1,2); plot(w3); 
        title('w3 = ifft( [ W3; H ]')
        
        fprintf('Data size at the beginning:\n');
        size(w)
        fprintf('Final sata size:\n');
        size(w3)
        

        【讨论】:

          猜你喜欢
          • 2013-04-06
          • 1970-01-01
          • 2022-01-25
          • 1970-01-01
          • 2020-09-06
          • 1970-01-01
          • 1970-01-01
          • 2011-11-14
          • 1970-01-01
          相关资源
          最近更新 更多