2017-06-07 8 views
2

Je suis en train de mettre en œuvre un 32 points FFT - Equalizer - iFFTFFT Matlab -> Egaliseur -> iFFT

Sur une étape par étape. J'ai entré un signal de domaine temporel dans un bloc FFT, puis j'ai utilisé iFFT pour récupérer les données d'origine.

Naturellement après FFT, j'obtiens 32 points de données réelles et imaginaires symétriques.

J'ai essayé,

Étape 1:

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

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

La sortie correspond à l'entrée. Fonctionne comme un charme.

Étape 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 

Cela fonctionne aussi très bien.

Étape 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 

Cela fonctionne aussi bien.

Etape 4:

I remplacé la constante (1.0) avec une table d'égaliseur. De taille 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) et Eq_data_32 (17) sont des zéros. Eq_data_32 (2:16) est symétrique à 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 

Maintenant, la sortie est déformée et ne sonne pas bien. Je pense que cela est dû à la symétrie de la table Equalizer. Je n'arrive pas à comprendre comment organiser la table Equalizer pour préserver la symétrie. Autant que je sache, ma table Equalizer réelle et imaginaire est symétrique. Alors pourquoi ne puis-je obtenir une sortie claire?

Code complet:

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

était le «fft» d'origine 32 de longueur? –

+0

@AnderBiguri Oui. C'était. Le fait que le programme fonctionne bien sans l'Equalizer ou une valeur constante pour un Equalizer indique que le FFT-iFFT n'est pas le problème, mais la symétrie de l'Equalizer. Donc j'essaie de comprendre comment sont les données de l'égaliseur. C'est là que le problème est. Je pense que mes données Equalizer sont symétriques, mais ça ne marche toujours pas. d'où ma confusion et la recherche de réponses. –

+0

Je pense que cela a besoin d'un [mcve] –

Répondre

2

multiplication dans le domaine de fréquence est convolution circulaire dans le domaine temporel. La convolution circulaire signifie que la fin de votre processus de filtrage multiplie et corrompt le début de chaque tampon FFT/IFFT. Au lieu de cela, zéro-pad chaque FFT d'au moins la longueur de la réponse impulsionnelle de votre filtre d'égalisation. Utilisez ensuite overlap-add ou overlap-save (méthodes/algorithmes de convolution rapide) pour recombiner vos résultats IFFT. De plus, si vous voulez un résultat strictement réel (pas de nombres imaginaires non nuls), assurez-vous que l'entrée de votre IFFT est symétrique conjuguée.