2017-06-07 5 views
2

私は32ポイントのFFTを実装しようとしています。タイムドメイン信号をFFTブロックに入力し、元のデータを取得するためにiFFTを使用しました。MATLAB FFT - >イコライザー - ステップごとのステップをIFFT</p> <p>- イコライザー - > IFFT

自然にFFTを実行した後、32ポイントの対称の実数と虚数のデータが得られます。

Iが試し、

ステップ1:

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

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

出力が入力と一致します。魅力のように動作します。

ステップ2:

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 

また、これは正常に動作します。

ステップ4:

Iは、イコライザテーブルと定数(1.0)に置き換え。サイズのもの。

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 

出力が歪んで良好に聞こえません。これはイコライザーテーブルの対称性によるものだと思います。対称性を保つためにEqualizerテーブルを配置する方法を理解できません。私が知る限り、私の実際のイマライザテーブルと想像上のイコライザテーブルは対称です。だから私は明確な出力を得ることができないのですか?

完全なコード:周波数領域における

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; 
+0

は元の 'fft' 32の長さですか? –

+0

@AnderBiguriはい。そうだった。プログラムがイコライザなしで正常に動作するという事実、またはイコライザの定数値は、FFT-iFFTが問題ではなく、イコライザの対称性を指していることを示しています。 私はイコライザーデータの配置の周りに頭を抱えようとしています。問題がどこにあるか。私はイコライザーのデータが対称であると思うが、それでも動作しない。私の混乱と答えの検索。 –

+0

これは[mcve]が必要だと思います –

答えて

2

乗算は時間領域における巡回畳み込みです。循環畳み込みは、乗算フィルタ処理の終了が、各FFT/IFFTバッファの先頭を折り返して破損させることを意味します。

代わりに、各FFTをゼロパッドで、少なくともイコライゼーションフィルタのインパルス応答の長さで埋めてください。 IFFT結果を再合成するには、オーバーラップ加算またはオーバーラップセーブ(高速コンボリューション法/アルゴリズム)のいずれかを使用します。

また、厳密に実際の結果(ゼロ以外の虚数を含まない)を使用する場合は、IFFTへの入力が共役対称であることを確認してください。

関連する問題