Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Спектральный анализ Фурье
Форум разработчиков электроники ELECTRONIX.ru > Цифровая обработка сигналов - ЦОС (DSP) > Алгоритмы ЦОС (DSP)
Who_are_you?
Давно учил спектральный анализ Фурье.

Подскажите, где почитать!

Тема:
При обработке оцифрованного сигнала иногда факт,
что разрыв данных.
Чем дополнить, например, середину данных, чтобы не повлиять на Фурье анализ?
При анализе окнами не хочется выбрасывать окно, где разрыв данных.
Alex11
Не хочется - а придется. Для того, чтобы разрыв не повлиял, Вам на буфер с разрывом нужно наложить два разных окна - на кусок целых данных до и после разрыва, но если в нормальной ситуации Вы использете окно на весь буфер, то сдесь Вам придется использовать более узкое - результат изменится, хотя не так фатально, как при попадании разрыва в расчет. Лучше использовать Фурье с перекрытием окон и последующим усреднением. В этом случае пропавшее окно можно с некоторой степенью приближения заменить предыдущим, после чего усреднение сведет ошибку к совсем малой.
Who_are_you?
Цитата(Alex11 @ Aug 1 2013, 12:09) *
Не хочется - а придется.


А если 2,3 - 10 отсчетов пропущено, то тоже ничем нельзя заменить?

Lmx2315
QUOTE (Who_are_you? @ Aug 1 2013, 15:00) *
А если 2,3 - 10 отсчетов пропущено, то тоже ничем нельзя заменить?

..а как вы узнаете что у вас разрыв, а не сигнал?
Who_are_you?
Предлагаю:
Нажмите для просмотра прикрепленного файла

1. Дополнить предполагаемым синусом

2. Дополнить предполагаемым синусом до нуля слева и справа, а между ними заполнить нулями.

Цитата(Lmx2315 @ Aug 1 2013, 14:25) *
..а как вы узнаете что у вас разрыв, а не сигнал?

В моем случае я знаю, что процесс непрерывный.
Who_are_you?
Цитата(petrov @ Aug 1 2013, 15:54) *


Спасибо, почитаю.
Who_are_you?
Почитал 00100263.pdf . Статья интересная.

Но меня интересуют не вопросы восстановления сигнала, а принципы изменения данных
не вносящих дополнительной информации при обработке.
Alex11
Что-то Вы такое сказанули - столько не живут. Если данные изменены - то что-то дополнительное привнесено.
Ваши картинки из поста от 01 aug не предполагают адекватного результата при использовании анализа, базирующегося на преобразовании Фурье. Фурье-преобразование выделяет гармоники ПЕРИОДИЧЕСКОГО сигнала. То, что нарисовано, особенно на катинке 1, периодическим никак не является. Таким образом, результат преобразования Фурье будет мало предскзуемым и почти неинформативным. Так что рассказывайте в подробностях, что за сигнал, как получен, какие пропадания, если хотите получить адекватный ответ.
Corner
Цитата(Alex11 @ Aug 6 2013, 00:14) *
Что-то Вы такое сказанули - столько не живут. Если данные изменены - то что-то дополнительное привнесено.

Ну хоть кто-то что-то тут понимает, а то такое пишут - закачаешься...
Xenia
Заполнять промежутки надо ... прямой линией sm.gif. Т.е. провести прямую линию от конечной точки одного участка до начальной точки следующего за ним. Типа натянуть проволоку над пропастью.

Оно, конечно, пропущенные данные не восстановит, но, по крайней мере, не породит биений, характерных для резкого разрыва непрерывности.
Corner
Цитата(Xenia @ Aug 17 2013, 22:13) *
Заполнять промежутки надо ... прямой линией sm.gif. Т.е. провести прямую линию от конечной точки одного участка до начальной точки следующего за ним. Типа натянуть проволоку над пропастью.

Оно, конечно, пропущенные данные не восстановит, но, по крайней мере, не породит биений, характерных для резкого разрыва непрерывности.


Хе, переход от колебаний к прямой линии это тоже разновидность колебаний.... причем, с теоретически, бесконечным спектром
Mikhail K.
Цитата(Who_are_you? @ Aug 1 2013, 12:35) *
Давно учил спектральный анализ Фурье.

Подскажите, где почитать!

Тема:
При обработке оцифрованного сигнала иногда факт,
что разрыв данных.
Чем дополнить, например, середину данных, чтобы не повлиять на Фурье анализ?
При анализе окнами не хочется выбрасывать окно, где разрыв данных.


Можно вычислить дискретное преобразование Фурье с оцифровкой с неравномерным шагом. Это сводится к решению линейной системы.
Corner
Цитата(Mikhail K. @ Aug 27 2013, 00:29) *
Можно вычислить дискретное преобразование Фурье с оцифровкой с неравномерным шагом. Это сводится к решению линейной системы.


Даже боюсь предположить сколько таблиц с коэффициентами для этого потребуется.
Tiro
Цитата(Xenia @ Aug 17 2013, 21:13) *
Заполнять промежутки надо ... прямой линией sm.gif. Т.е. провести прямую линию от конечной точки одного участка до начальной точки следующего за ним. Типа натянуть проволоку над пропастью.

Оно, конечно, пропущенные данные не восстановит, но, по крайней мере, не породит биений, характерных для резкого разрыва непрерывности.

Не надо прямой аппроксимировать. Лучше пропустить через цифровой фильтр с частотой среза, близкой к частоте Найквиста. Еще возможен сплайн, если сигнал гладкий.
Navstar
Требуется помощь!

Согласно ТЗ мне нужно сделать дискретное преобразование Фурье массива выборок.
С прямым, все отлично - получаем амплитудный и фазовый спектр, и непосредственно зеркальный спектр. а вот с обратным преобразованием не получается - результатом ОДПФ, согласно формуле появляются 2 массива состовляющих "Мнимые" и "реальные". Как из них получить результирующий массив(Например делая ДПФ и ОДПФ получить исходный массив)? Есть наброска на джаве:

Задаем массив signal

Прямое ДПФ
Код
private static void DFT(double[] signal, double[] phase)
  {
     double[] Re = new double[1024];
     double[] Im = new double[1024];
     for(int k = 0; k < 1024; k++)
     {
        for(int n = 0; n < 1024; n++){  
     Re[k]=Re[k]+signal[n]*Math.cos(-2*Math.PI*k*n/1024);
     Im[k]=Im[k]+signal[n]*Math.sin(-2*Math.PI*k*n/1024);}
     }
        
        for(int k = 0; k < 1024; k++)
     {
        signal[k]=Math.sqrt(Re[k]*Re[k]+Im[k]*Im[k]);
        phase[k]=Math.atan(Im[k]/Re[k]);        
     }


Обратное ДПФ
Код
private static void IDFT(double[] signal, double[] phase)
  {
     double[] Re = new double[1024];
     double[] Im = new double[1024];
    for(int n = 0; n < 1024; n++)
     {

        
        for(int k = 0; k < 1024; k++)  
        {  
            
     Re[n]=Re[n]+signal[k]*Math.cos(2*Math.PI*k*n/1024+phase[n]);
     Im[n]=Im[n]+signal[k]*Math.sin(2*Math.PI*k*n/1024+phase[n]);
                
        }
       Re[n]=Re[n]/1024;
       Im[n]=Im[n]/1024;
      
     }

  }


Как теперь получить исходя из этих массивов опратно массив signal выполнив подряд процедуры прямого и обратного преобразования
Alex11
Из результата первой функции Вы не восстановите исходный сигнал, т.к. уже потеряли часть информации о нем, взяв квадратный корень. На вход обратного преобразования нужно подавать массивы Re и Im из прямой функции перед взятием корня и арктангенса. Тогда получите исходны сигнал в Re и нули в Im на выходе обратного преобразования. Разумеется, с точностью до ошибок счета.
ivan219
Цитата(Alex11 @ Sep 15 2013, 10:51) *
Из результата первой функции Вы не восстановите исходный сигнал, т.к. уже потеряли часть информации о нем, взяв квадратный корень.

Ни куда эта информация не делась. Она только претерпела изменение. И восстановить исходный сигнал по имеющимся значениям амплитуды и фазы можно.

А не работает скорей всего из за ошибки со знаками где то + с - перепутали. Где именно и как нужно смотреть формулы.
Navstar
Проблема была в том что нужно было использовать функции аргумента, а не арктангенса, а так же фильтровать спектр от зеркальной составляющей, занулив ее и удвоив исходный спектр
Может кому пригодится исходный код на java. Все это будет интегрироваться в Embedded систему с linux ядром.
Код

private static void DFT(double[] signal, double[] phase)
  {
     double[] Re = new double[1024];
     double[] Im = new double[1024];
     for(int k = 0; k < 1024; k++)
     {
        for(int n = 0; n < 1024; n++)
        {  
     Re[k]=Re[k]+signal[n]*Math.cos(-2*Math.PI*k*n/1024 );
     Im[k]=Im[k]+signal[n]*Math.sin(-2*Math.PI*k*n/1024 );
        }
     }
        
       for(int k = 0; k < 1024; k++)
     {
        signal[k]=2*Math.sqrt(Re[k]*Re[k]+Im[k]*Im[k]);
        phase[k]=Math.atan2(Im[k],Re[k]);
     }  
                
            
       for(int n = 512; n < 1024; n++)
             {
                       signal[n]=0;
                       phase[n]=0;  
             }
      
  }
  
  
  private static void ODFT(double[] signal, double[] phase)
  {
     double[] Re = new double[1024];
     double[] Im = new double[1024];
    for(int n = 0; n < 1024; n++)
     {
            Re[n]=signal[n]*Math.cos(phase[n]);
            Im[n]=signal[n]*Math.sin(phase[n]);      
         }
    
    for(int n = 0; n < 1024; n++)
     {        
       signal[n]=0;
       phase[n]=0;
        for(int k = 0; k < 1024; k++)  
        {
             signal[n]=signal[n]+Re[k]*Math.cos(2*Math.PI*k*n/1024)-Im[k]*Math.sin(2*Math.PI*k*n/1024);
        }
      
     }
    for(int n = 0; n < 1024; n++)
     {
         signal[n]=signal[n]/1024;
        }
  }
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.