【问题标题】:MATLAB FFT -> Equalizer -> iFFTMATLAB FFT -> 均衡器 -> iFFT
【发布时间】:2017-06-07 07:26:57
【问题描述】:

我正在尝试实现 32 点 FFT - 均衡器 - iFFT

循序渐进。我将时域信号输入到 FFT 块,然后使用 iFFT 获取原始数据。

在 FFT 之后自然得到 32 点对称的实部和虚部数据。

我试过了,

第一步:

   fft_sig = fft(data_processing_block);                 %FFT of the signal

  ifft_sig = ifft(fft_sig);                            %iFFT of the signal

输出与输入匹配。奇迹般有效。

第二步:

  fft_sig = fft(data_processing_block);                 %FFT of the signal

  after_eq_re = real(fft_sig);
  after_eq_im = imag(fft_sig);

  after_eq = after_eq_re + (i*after_eq_im);

  ifft_sig = ifft(after_eq);                            %iFFT of the signal

这也很好用。

第 3 步:

  fft_sig = fft(data_processing_block);                 %FFT of the signal

  after_eq_re = real(fft_sig).*1.0;                     % Multiply Real data with a constant       
  after_eq_im = imag(fft_sig).*1.0;                     % Multiply Imag data with a constant 

  after_eq = after_eq_re + (i*after_eq_im);

  ifft_sig = ifft(after_eq);                            %iFFT of the signal

这也很好用。

第四步:

我用均衡器表替换了常数 (1.0)。大小 32。

Eq_data_32 =[0.0;0.1347;0.2117;0.2956;0.4146;0.5300;0.5615;0.5195;0.4391;0.3621;0.2816;0.1977;0.1837;0.1172;0.0857;0.0577;0.0;0.0577;0.0857;0.1172;0.1837;0.1977;0.2816;0.3621;0.4391;0.5195;0.5615;0.5300;0.4146;0.2956;0.2117;0.1347];

Eq_data_32(1) 和 Eq_data_32(17) 为零。 Eq_data_32(2:16) 与 Eq_data_32(18:32) 对称。

 re_Eq_data_32 = Eq_data_32;  % Equalizer data for real values
 im_Eq_data_32 = -(re_Eq_data_32);  % Equalizer data for imaginary values

  fft_sig = fft(data_processing_block);                 %FFT of the signal

  after_eq_re = real(fft_sig).*re_Eq_data_32';
  after_eq_im = imag(fft_sig).*im_Eq_data_32';

  after_eq = after_eq_re + (i*after_eq_im);     
  ifft_sig = ifft(after_eq);                             %iFFT of the signal

现在输出失真,听起来不太好。我认为这是由于均衡器表的对称性。我不知道如何安排均衡器表以保持对称性。据我所知,我的真实和虚构均衡器表是对称的。那么为什么我不能得到一个清晰的输出呢?

完整代码:

Fs = 16000;                       % sampling frequency
no_samples = 640;                  % no of samples
Freq1 = 1000;                      % Frequency 1 of the signal
Freq2 = 2500;                      % Frequency 2 of the signal
Freq3 = 3500;                      % Frequency 3 of the signal
Amp = 0.1;
t = 1/Fs*((1:no_samples)-1);      % time duration, t = 1/Fs
Input_sig_16k = Amp*sin(2*pi*Freq1*t)+Amp*sin(2*pi*Freq2*t)+Amp*sin(2*pi*Freq3*t);  % Multitone Input Signal 

% Equlizer data
Eq_data_32 =[0.0;0.1347;0.2117;0.2956;0.4146;0.5300;0.5615;0.5195;0.4391;0.3621;0.2816;0.1977;0.1837;0.1172;0.0857;0.0577;0.0;0.0577;0.0857;0.1172;0.1837;0.1977;0.2816;0.3621;0.4391;0.5195;0.5615;0.5300;0.4146;0.2956;0.2117;0.1347];

re_Eq_data_32 = Eq_data_32;  % Equalizer data for real values
im_Eq_data_32 = -(re_Eq_data_32);

window_size = 32;

 for ii = 1:(length(Input_sig_16k)/window_size)-1

  data_range = (((ii-1)*window_size)+1:((ii-1)*window_size)+32);
  data_block = Input_sig_16k(data_range);

  fft_sig = fft(data_block);                 %FFT of the signal

  after_eq_re = real(fft_sig).*re_Eq_data_32';   % Multiply real portion of FFT with Equalizer
  after_eq_im = imag(fft_sig).*im_Eq_data_32';   % Mutliply imaginary portion with Equalizer

  after_eq = after_eq_re + (i*after_eq_im);

  ifft_sig = ifft(fft_sig);                  %iFFT of the signal

 data_full(data_range) = ifft_sig;            % Output signal

 end

plot(Input_sig_16k,'-og'), grid on;   % plot and compare both the signals
hold on;
plot(data_full,'-xr')
hold off;

【问题讨论】:

  • 原来的fft长度是32吗?
  • @AnderBiguri 是的。它是。程序在没有均衡器或均衡器的恒定值的情况下运行良好的事实表明 FFT-iFFT 不是问题,而是均衡器的对称性。所以我试图了解均衡器数据的排列。这就是问题所在。我认为我的均衡器数据是对称的,但它仍然不起作用。因此我感到困惑并寻找答案。
  • 我认为这需要minimal reproducible example
  • @AnderBiguri 我在原帖中添加了完整的代码。如果您交替使用以下行 ifft_sig = ifft(fft_sig);在上面和下面之间 ifft_sig = ifft(after_eq);你会得到没有和有均衡器的效果。
  • 您是否可能需要fftshift Eq_data_32

标签: matlab fft ifft


【解决方案1】:

频域的乘法是时域的循环卷积。循环卷积意味着乘法过滤过程的结束会环绕并破坏每个 FFT/IFFT 缓冲区的开始。

相反,每个 FFT 至少填充均衡滤波器的脉冲响应长度。然后使用重叠添加或重叠保存(快速卷积方法/算法)重新组合您的 IFFT 结果。

此外,如果您想要一个严格的实数结果(没有非零虚数),请确保您的 IFFT 输入是共轭对称的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-11
    • 1970-01-01
    • 2013-12-05
    • 1970-01-01
    相关资源
    最近更新 更多