|
Спектральный анализ Фурье, Разрыв в оцифровке. Что делать? |
|
|
|
Aug 1 2013, 11:00
|

Частый гость
 
Группа: Участник
Сообщений: 185
Регистрация: 5-02-10
Из: Донецк
Пользователь №: 55 329

|
Цитата(Alex11 @ Aug 1 2013, 12:09)  Не хочется - а придется. А если 2,3 - 10 отсчетов пропущено, то тоже ничем нельзя заменить?
|
|
|
|
|
Aug 1 2013, 12:18
|

Частый гость
 
Группа: Участник
Сообщений: 185
Регистрация: 5-02-10
Из: Донецк
Пользователь №: 55 329

|
Предлагаю:
1. Дополнить предполагаемым синусом 2. Дополнить предполагаемым синусом до нуля слева и справа, а между ними заполнить нулями. Цитата(Lmx2315 @ Aug 1 2013, 14:25)  ..а как вы узнаете что у вас разрыв, а не сигнал? В моем случае я знаю, что процесс непрерывный.
|
|
|
|
|
Aug 5 2013, 20:14
|
Гуру
     
Группа: Свой
Сообщений: 2 106
Регистрация: 23-10-04
Из: С-Петербург
Пользователь №: 965

|
Что-то Вы такое сказанули - столько не живут. Если данные изменены - то что-то дополнительное привнесено. Ваши картинки из поста от 01 aug не предполагают адекватного результата при использовании анализа, базирующегося на преобразовании Фурье. Фурье-преобразование выделяет гармоники ПЕРИОДИЧЕСКОГО сигнала. То, что нарисовано, особенно на катинке 1, периодическим никак не является. Таким образом, результат преобразования Фурье будет мало предскзуемым и почти неинформативным. Так что рассказывайте в подробностях, что за сигнал, как получен, какие пропадания, если хотите получить адекватный ответ.
|
|
|
|
|
Aug 17 2013, 18:22
|

Профессионал
    
Группа: Участник
Сообщений: 1 072
Регистрация: 11-12-12
Пользователь №: 74 815

|
Цитата(Xenia @ Aug 17 2013, 22:13)  Заполнять промежутки надо ... прямой линией  . Т.е. провести прямую линию от конечной точки одного участка до начальной точки следующего за ним. Типа натянуть проволоку над пропастью. Оно, конечно, пропущенные данные не восстановит, но, по крайней мере, не породит биений, характерных для резкого разрыва непрерывности. Хе, переход от колебаний к прямой линии это тоже разновидность колебаний.... причем, с теоретически, бесконечным спектром
|
|
|
|
|
Aug 26 2013, 20:29
|
Группа: Новичок
Сообщений: 9
Регистрация: 26-08-13
Пользователь №: 78 056

|
Цитата(Who_are_you? @ Aug 1 2013, 12:35)  Давно учил спектральный анализ Фурье.
Подскажите, где почитать!
Тема: При обработке оцифрованного сигнала иногда факт, что разрыв данных. Чем дополнить, например, середину данных, чтобы не повлиять на Фурье анализ? При анализе окнами не хочется выбрасывать окно, где разрыв данных. Можно вычислить дискретное преобразование Фурье с оцифровкой с неравномерным шагом. Это сводится к решению линейной системы.
|
|
|
|
|
Sep 2 2013, 22:20
|
Знающий
   
Группа: Свой
Сообщений: 781
Регистрация: 3-10-04
Из: Санкт-Петербург
Пользователь №: 768

|
Цитата(Xenia @ Aug 17 2013, 21:13)  Заполнять промежутки надо ... прямой линией  . Т.е. провести прямую линию от конечной точки одного участка до начальной точки следующего за ним. Типа натянуть проволоку над пропастью. Оно, конечно, пропущенные данные не восстановит, но, по крайней мере, не породит биений, характерных для резкого разрыва непрерывности. Не надо прямой аппроксимировать. Лучше пропустить через цифровой фильтр с частотой среза, близкой к частоте Найквиста. Еще возможен сплайн, если сигнал гладкий.
|
|
|
|
|
Sep 13 2013, 15:21
|
Участник

Группа: Участник
Сообщений: 32
Регистрация: 29-11-09
Пользователь №: 53 951

|
Требуется помощь! Согласно ТЗ мне нужно сделать дискретное преобразование Фурье массива выборок. С прямым, все отлично - получаем амплитудный и фазовый спектр, и непосредственно зеркальный спектр. а вот с обратным преобразованием не получается - результатом ОДПФ, согласно формуле появляются 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 выполнив подряд процедуры прямого и обратного преобразования
|
|
|
|
|
Sep 15 2013, 07:54
|
Местный
  
Группа: Участник
Сообщений: 350
Регистрация: 16-11-08
Пользователь №: 41 680

|
Цитата(Alex11 @ Sep 15 2013, 10:51)  Из результата первой функции Вы не восстановите исходный сигнал, т.к. уже потеряли часть информации о нем, взяв квадратный корень. Ни куда эта информация не делась. Она только претерпела изменение. И восстановить исходный сигнал по имеющимся значениям амплитуды и фазы можно. А не работает скорей всего из за ошибки со знаками где то + с - перепутали. Где именно и как нужно смотреть формулы.
Сообщение отредактировал ivan219 - Sep 15 2013, 07:56
|
|
|
|
|
Sep 18 2013, 11:49
|
Участник

Группа: Участник
Сообщений: 32
Регистрация: 29-11-09
Пользователь №: 53 951

|
Проблема была в том что нужно было использовать функции аргумента, а не арктангенса, а так же фильтровать спектр от зеркальной составляющей, занулив ее и удвоив исходный спектр Может кому пригодится исходный код на 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; } }
Сообщение отредактировал Navstar - Sep 18 2013, 11:49
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|