MATLAB FFT -> Эквалайзер -> iFFT

Я пытаюсь реализовать 32-точечное БПФ — Эквалайзер — iFFT

На пошаговой основе. Я ввожу сигнал во временной области в блок БПФ, а затем использую iFFT для получения исходных данных.

Естественно после БПФ я получаю 32 точки симметричных реальных и мнимых данных.

Я старался,

Шаг 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:

Я заменил константу (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;

person Big Head    schedule 07.06.2017    source источник
comment
был исходный fft 32 длины?   -  person Ander Biguri    schedule 07.06.2017
comment
@АндерБигури Да. Это было. Тот факт, что программа отлично работает без эквалайзера или постоянного значения для эквалайзера, указывает на то, что проблема не в БПФ-иБПФ, а в симметрии эквалайзера. Поэтому я пытаюсь разобраться в расположении данных эквалайзера. Вот где проблема. Я думаю, что мои данные эквалайзера симметричны, но это все равно не работает. отсюда мое замешательство и поиск ответов.   -  person Big Head    schedule 07.06.2017
comment
Я думаю, что для этого нужен минимальный воспроизводимый пример   -  person Ander Biguri    schedule 07.06.2017
comment
@AnderBiguri Я добавил полный код в исходный пост. Если вы чередуете следующую строку ifft_sig = ifft(fft_sig); между приведенным выше и следующим ifft_sig = ifft(after_eq); вы получаете эффекты без эквалайзера и с ним.   -  person Big Head    schedule 07.06.2017
comment
Возможно ли, что вам нужно fftshift Eq_data_32?   -  person Shai    schedule 07.06.2017


Ответы (1)


Умножение в частотной области — это круговая свертка во временной области. Циклическая свертка означает, что конец вашего процесса фильтрации умножения зацикливается и искажает начало каждого буфера FFT/IFFT.

Вместо этого заполните нулями каждое БПФ, по крайней мере, на длину импульсной характеристики вашего выравнивающего фильтра. Затем используйте либо добавление с перекрытием, либо сохранение с перекрытием (методы/алгоритмы быстрой свертки), чтобы повторно объединить результаты IFFT.

Кроме того, если вам нужен строго реальный результат (без ненулевых мнимых чисел), убедитесь, что вход в ваш IFFT является сопряженно-симметричным.

person hotpaw2    schedule 07.06.2017