Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Цифровая фильтрация + БПФ
Форум разработчиков электроники ELECTRONIX.ru > Цифровая обработка сигналов - ЦОС (DSP) > Алгоритмы ЦОС (DSP)
CTPEXHIH
Существует следующая задача: есть периодический сигнал с определенным уровнем шумов, частоту которого надо определить. Данный сигнал является сигналом с датчика вихревого расходомера. Ведущие мировые производители таких расходомеров (Yokogawa, например), применяет следующий алгоритм ЦОС: Преобразование Фурье входного сигнала -> преобразование Фурье коэффициентов КИХ-фильтра -> быстрая свертка КИХ-фильтра и сигнала -> обратное преобразование Фурье результатов свертки. То есть, они делают классическую цифровую фильтрацию входного сигнала. Затем определяется частота отфильтрованного от помех сигнала.

Вопрос в следующем: почему не определить частоту сигнала, сделав БПФ исходного сигнала с шумом, и приняв за частоту полезного сигнала частоту максимальной составляющей в спектре?

У меня есть предположение, что из-за того, что частоты на спектре дискретны, так не получится определить частоту, лежащую между частотами спектра. Например, разложили сигнал по частотам 1, 2, 3, 4, ... Гц. Тогда по спектру не определить частоту 3,3 Гц, то есть определить-то можно, но пик будет на 3 Гц, а 3,3 в спектре просто нет.
Xenia
Цитата(CTPEXHIH @ Nov 9 2011, 18:14) *
У меня есть предположение, что из-за того, что частоты на спектре дискретны, так не получится определить частоту, лежащую между частотами спектра. Например, разложили сигнал по частотам 1, 2, 3, 4, ... Гц. Тогда по спектру не определить частоту 3,3 Гц, то есть определить-то можно, но пик будет на 3 Гц, а 3,3 в спектре просто нет.

В таких случаях берут не частоту масимальной амплитуды, а находят центр тяжести в окружении двух соседних частот - тогда получится искомая 3,3.
AlexU
Цитата(CTPEXHIH @ Nov 9 2011, 17:14) *
Вопрос в следующем: почему не определить частоту сигнала, сделав БПФ исходного сигнала с шумом, и приняв за частоту полезного сигнала частоту максимальной составляющей в спектре?

Уже сделали 3 года назад для питерских расходомеров. laughing.gif
Дмитрий_Б
Цитата(Xenia @ Nov 9 2011, 20:11) *
В таких случаях берут не частоту масимальной амплитуды, а находят центр тяжести в окружении двух соседних частот - тогда получится искомая 3,3.

Оценка будет смещённой.
Alex11
По-хорошему нужно делать по нескольким точкам аппроксимацию оконной функцией и оттуда считать максимум. Тогда ответ точный.
CTPEXHIH
Почему же тогда в описании к расходомерам Yokogawa описан алгоритм фильтрации и т.д., а не просто определение частоты по спектру? Почему они не определяют частоту сигнала тупо из спектра? Возможно, есть какие-то причины, по которым так делать нельзя? Зачем тогда применять цифровую фильтрацию КИХ, БИХ? Взял просто в спектре занулил все гармоники в полосе подавления и сделал ОБПФ и все, получил чистейший фильтрованный сигнал! НО так почему-то не делается, а придумали разные фильтры.
dmitry-tomsk
Цитата(CTPEXHIH @ Nov 12 2011, 21:37) *
Почему же тогда в описании к расходомерам Yokogawa описан алгоритм фильтрации и т.д., а не просто определение частоты по спектру? Почему они не определяют частоту сигнала тупо из спектра? Возможно, есть какие-то причины, по которым так делать нельзя? Зачем тогда применять цифровую фильтрацию КИХ, БИХ? Взял просто в спектре занулил все гармоники в полосе подавления и сделал ОБПФ и все, получил чистейший фильтрованный сигнал! НО так почему-то не делается, а придумали разные фильтры.

так поступают, если сигнал не гармонический. Свёртка с опорным сигналом правильной формы даём максимально узкую взаимно корреляционную функцию, что увеличит отношение сигнал шум и сделает оценку частоты более точной.
Mad_max
Цитата(CTPEXHIH @ Nov 12 2011, 20:37) *
Почему они не Взял просто в спектре занулил все гармоники в полосе подавления и сделал ОБПФ и все, получил чистейший фильтрованный сигнал! НО так почему-то не делается, а придумали разные фильтры.

Если нужно восстановить сигнал, то лучше не занулять составляющие спектра,
а то после обратного Фурье сигнал будет содержать то чего не было на входе.
Эффект Гиббса.
Если сигнал не нужно восстанавливать, то для удобств дальнейшего обработки можно и занулить что-то.
Большого криминала тут не будет, но в это задаче не понятно что занулять, вы же не знаете где у вас изначально
в спектре сидит полезный сигнал. Не то занулите и не найдет, то что ищете.

А фильтры разные придумали для того чтобы подавить шумы обрабатываемого сигнала, спектр которых заведомо не пересекается со спектром
полезного сигнала, тем самым повысив соотношение сигнал/шум перед проведением ДПФ.
В спектре отфильтрованного сигнал легче обнаружить составляющие полезного сигнала.
V_G
Вообще при вычислении частоты по спектру ОБПФ не нужно, конечно.
Но возможно, они сделали БПФ-фильтрацию, восстановили сигнал во временной области, а потом применили классический счетный частотомер: усиление-ограничение сигнала и подсчет числа импульсов в заданный промежуток времени? Тут вам и фильтрация в частотной области, и фактическое усреднение во временной, может, так получается самый точный результат.
CTPEXHIH
А как быть с тем, что при разложении сигнала в спектр по, например, 256 гармоникам, точное определение частоты будет просто невозможно из-за большой дискретности по частотам?

Ну, например, сигнал имеет частоту, отличную от тех, по которым производится разложение в спектр? раскладываем по частотам 1, 2, 3, ..., 256 Гц, а сигнал имеет частоту 55,45 Гц. На разложении будет один пик на 55 Гц, но определить по нему частоту нельзя, потеряем 0,45 Гц, то есть погрешность большая будет. Тут писали про центр тяжести по двум соседним частотам, но как что-то усреднить, если пик всего один на частоте 55 Гц, а на частотах 54 и 56 Гц амплитуда очень незначительная. Вот пример из матлаба.

Код
Fs = 20000;                    % Sampling frequency

T = 1/Fs;                     % Sample time
L = 256;                     % Length of signal
t = (0:L-1)*T;                % Time vector

y = 0.7*sin(2*pi*55*t); %Sinus 55 Hz

Y=fft(y);

subplot(1,1,1);
plot(y,t);
title('Спектр сигнала y')
xlabel('Частота (Hz)')
ylabel('|Y(f)|')


subplot(2,1,2);
plot(f,2*abs(Y(1:L/2+1)))
title('Спектр сигнала y')
xlabel('Частота (Hz)')
ylabel('|Y(f)|')


Ниже прикреплен файл с сигналом и разложением в спектр. Две соседние частоты 78,13 и 156,3 Гц, а заданная частота сигнала - 55 Гц. Как правильно определить частоту сигнала из такого спектра?
Mad_max
Цитата(CTPEXHIH @ Nov 13 2011, 11:40) *
А как быть с тем, что при разложении сигнала в спектр по, например, 256 гармоникам, точное определение частоты будет просто невозможно из-за большой дискретности по частотам?

Ну ДПФ вообще имеет много недостатков. В частности, то о чем вы говорите называется "утечками" ДПФ.
Для минимизации сего эффекта применяется техника завешивания окном, поищите в интернете много информации на эту тему.
Да и вообще всегда лучше брать макимально возможное количество точек ДПФ, повышая тем самым частотное разрешение.
Если ваш сигнал подать на вход 8 точечного ДПФ, то на выходе вы вообще получите семигорбое чудовище. В матлабе может
и ничего результат будет, а вот в железе если, то точно ничего не разберете.

dmitry-tomsk
Цитата(CTPEXHIH @ Nov 13 2011, 11:40) *
А как быть с тем, что при разложении сигнала в спектр по, например, 256 гармоникам, точное определение частоты будет просто невозможно из-за большой дискретности по частотам?

Смотрите в соседней теме, интерполяция спектра позволяет определить много точнее частоту, чем шаг по частоте в дпф. Хорошие результаты даёт дополнение нулями для увеличения числа точек дпф и применение оконных функций с широким главным лепестком (точность увеличивается, разрешающая способность уменьшается)
fontp
QUOTE (V_G @ Nov 13 2011, 05:01) *
Вообще при вычислении частоты по спектру ОБПФ не нужно, конечно.
Но возможно, они сделали БПФ-фильтрацию, восстановили сигнал во временной области, а потом применили классический счетный частотомер: усиление-ограничение сигнала и подсчет числа импульсов в заданный промежуток времени? Тут вам и фильтрация в частотной области, и фактическое усреднение во временной, может, так получается самый точный результат.


Так то оно так. Возможно. Только где фильтровать знать нужно заранее. И если частота неизвестна в широком дипазоне, то и фильтрация ничего не даст
ivan219
А если предположить что после БПФ определяется максимальный бин поле рассчитывается полосовой фильтр с полосой = +-1 бин от максимума. И сигнал фильтруется. А потом во временной области определяют частоту.
SPACUM
Цитата(CTPEXHIH @ Nov 9 2011, 18:14) *
Преобразование Фурье входного сигнала -> преобразование Фурье коэффициентов КИХ-фильтра -> быстрая свертка КИХ-фильтра и сигнала -> обратное преобразование Фурье результатов свертки. То есть, они делают классическую цифровую фильтрацию входного сигнала. Затем определяется частота отфильтрованного от помех сигнала.

Вопрос в следующем: почему не определить частоту сигнала, сделав БПФ исходного сигнала с шумом, и приняв за частоту полезного сигнала частоту максимальной составляющей в спектре?

1.Если они делают обратное преобразование, значит не хотят использовать БПФ для измерения, а используют, например, точки перехода через нуль уточняя их по нескольким отсчетам около. Вполне разумный метод и точный.
2.Здесь предложено несколько методов и все имеют право на существование, если у Вас имеются записи реального сигнала легко проверить каждый и выбрать лучший.
3.При измерении механических параметров нечувствительность к помехам важнее точности. Например ударить ломиком по трубе или включить какой-нибудь мотор рядом. Ложных показаний не должно быть, а измерения должны продолжиться скажем через полсекунды.

<Ниже прикреплен файл с сигналом>
Если хотите использовать БПФ - берите в выборку не менее 7 периодов сигнала и используйте какое-нибудь окно. А на Вашей приличный результат даст определение частоты по трем точкам(приблизительно через пи/4)
_pv
Цитата(CTPEXHIH @ Nov 13 2011, 14:40) *
Ниже прикреплен файл с сигналом и разложением в спектр. Две соседние частоты 78,13 и 156,3 Гц, а заданная частота сигнала - 55 Гц. Как правильно определить частоту сигнала из такого спектра?

а кто заставляет делать именно быстрое преобразование для всех частот и именно с такой сеткой.
можно же взять и посчитать обычное, f(f) = ∫g(t) (cos 2πft – i sin 2πft) dt, (или см. Goertzel) только на нужных частотах, например, от 54 до 56 Гц с любым шагом, хоть 0.1Гц, а потом еще и аппроксимировать чем-нибудь вроде полинома второй степени ax^2+bx+c и найти точно где у него максимум x0 = -b/2a.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.