首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >->均衡器-> iFFT

->均衡器-> iFFT
EN

Stack Overflow用户
提问于 2017-06-07 15:26:57
回答 0查看 1.1K关注 0票数 2

我正在尝试实现一个32点的快速傅立叶变换均衡器- iFFT

在逐步的基础上。我将时域信号输入到快速傅立叶变换模块,然后使用iFFT获得原始数据。

当然,经过FFT后,我得到了32个点的对称实数和虚数数据。

我试过了

步骤1:

代码语言:javascript
复制
   fft_sig = fft(data_processing_block);                 %FFT of the signal

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

输出与输入匹配。就像一种护身符。

第2步:

代码语言:javascript
复制
  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步:

代码语言:javascript
复制
  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

这也可以很好地工作。

第4步:

我用一个均衡器表替换了常量(1.0)。大小为32。

代码语言:javascript
复制
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)对称。

代码语言:javascript
复制
 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

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

完整代码:

代码语言:javascript
复制
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;
EN

回答

页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44406177

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档