Реализация фильтра нижних частот на частотах с использованием JAVA, просто имея массив частот и частоту среза

1

Первоначально у меня есть массив времени и массив напряжения, и я применил FFT и преобразовал этот временной домен в частотную область. После применения FFT я получил массив частот. Теперь я отключил частоту, и мне нужно реализовать фильтр нижних частот на том же самом. Мне нужно сделать это с помощью JAVA. Может ли кто-нибудь обратиться ко мне, если есть какой-либо открытый исходный код или какая-либо идея его реализации. Любые ссылки, которые будут реализованы с использованием значений частоты и частоты среза, помогут.

Я совершенно новичок в этой теме, поэтому мой подход к вопросу может быть немного странным. Спасибо заранее за поддержку !!!

  • 0
    stackoverflow.com/questions/4026648/...
  • 0
    Я видел этот пост. Но это не решило мое требование.
Показать ещё 1 комментарий
Теги:
fft

1 ответ

2
Лучший ответ

Поскольку у вас уже есть массив со значениями FFT, вы можете реализовать очень грубый фильтр низких частот, просто установив эти коэффициенты FFT, которые соответствуют частотам по вашему значению отсечки до нуля. Если вам нужен более хороший фильтр, вы можете реализовать цифровой фильтровать или находить реализацию LPF онлайн и просто использовать это.

EDIT: после вычисления FFT вы не получите массив частот, вы получите массив комплексных чисел, представляющий величину и фазу данных. Вы должны знать, какая частота каждого комплексного числа в массиве соответствует потому что результат FFT будет соответствовать равномерно разнесенным частотам от 0 до f_s, где f_s - частота дискретизации, которую вы использовали для получения ваших данных.

Полезным упражнением может быть попытка попробовать и построить частотный спектр, потому что после его построения будет ясно, как вы можете отказаться от высоких частот, тем самым реализуя LPF. Этот слегка похожий пост может помочь вам: LINK

EDIT: 1) Сначала вам нужно найти частоту дискретизации (f_s) ваших данных, это количество выборок, полученных каждую секунду. Его можно вычислить с использованием f_s = 1/T, где T - временной интервал между любыми двумя последовательные выборки во временной области.

2) После этого вы f_c на f_s, где f_c - частота среза, чтобы получить константу k.

3) Затем вы установите все COMPLEX-номера выше индекса (k раз N) в вашем массиве до нуля, где N - количество элементов в вашем массиве, простое, что и даст вам базовый фильтр нижних частот (LPF).

Грубый, ориентировочный (псевдо) код ниже:

Complex[] fftData = FFT(myData);
int N = fftData.Length;

float T = 0.001;   
float f_c = 500;   //f_c = 500Hz
float f_s = 1/T;   //f_s = 1000Hz

float k = f_c/f_s;
int index = RoundToNextLargestInteger(k * N);

//Low pass filter   
for(int i = index; index < N; index++)
   fftData[i] = 0;

Полученные в вашем случае fftData уже не будут в форме элементов класса Complex, поэтому убедитесь, что вы знаете, как ваши данные будут представлены и какие элементы данных будут установлены на ноль.

Это не очень хороший способ сделать это, хотя, поскольку одна частота в ваших данных может быть распределена по нескольким бункерам из-за утечки, поэтому в этом случае результаты будут неприятными. Изначально вы хотели бы создать правильный цифровой фильтр или просто использовать некоторые библиотеки программного обеспечения. Поэтому, если вам нужен очень точный LPF, вы можете пройти обычный процесс проектирования аналогового LPF и затем деформировать его на цифровой фильтр, как описано в этом документе.

  • 0
    Итак, простой цикл for, проходящий через весь массив частот, и если какое-то значение частоты в массиве выходит за пределы частоты отсечки, я могу преобразовать его в 0,00
  • 0
    Я прав? или вы что-то объясняете кроме этого? Спасибо!!
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню