| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Алгоритмы > точность Фурье |
| Автор: stab 1.2.2003, 20:54 |
| Сгенерял я сигнал с частотой 1000Гц, сделал Фурье и получил и что в сигнале присутствуют много разных частот, от 500 и до 1500 (примерно), причем амплитуды у них довольно большие. Делаю опять Фурье получаю вроде бы исходный сигнал, но он совершенно не похож на оригинал. Подскажите как быть? |
| Автор: podval 2.2.2003, 05:55 |
| А какой именно сигнал и как ты сгенерил? |
| Автор: stab 3.2.2003, 21:26 |
| синусойда, сгенерял в CoolEdit (редактор wav-ников если кто незнает) |
| Автор: podval 4.2.2003, 01:45 |
| Чистая синусоида - это не сигнал. Она не несет информации. Сигнал же несет информацию. А информация - это какие-либо нерегулярности. Допустим, модулированная синусоида - это уже сигнал. Чем-нибудь модулировал синусоиду? Чистая она или нет? Какой алгоритм преобразования применял? БПФ или в лоб ДПФ? Такой уж я буквоед |
| Автор: stab 4.2.2003, 04:59 |
| немодулированая, просто синусоида, ДПФ. Про сигнал: ну лана не сигнал, а отсчеты |
| Автор: podval 4.2.2003, 07:06 |
| Ну я понимаю, если бы БПФ с каким-то окном. Там имеется "натяжка": предполагается, что за пределами окна сигнал продолжается периодически. Отсюда некоторый гемморой. Ну а у тебя что? Последствия дискретизации, квантования? Можешь как-нибудь нарисовать или кинуть код? |
| Автор: val 20.2.2003, 23:46 |
| Вот пример расчетая прямого и обратного преобразования Фурье... Проверь, как у тебя... #define Pi 3.141592 #define Window 160 #define HalfWin 80 double rex[HalfWin+1]; double imx[HalfWin+1]; double workbuf[Window]; //тут лежит твой сигнал void DFT()//Discret Fourier Transform function { unsigned int i; unsigned int k; double w; w=2*Pi/Window; for(k=0;k<=HalfWin;k++) { rex[k]=0; imx[k]=0; } for(k=0;k<=HalfWin;k++) for(i=0;i<Window;i++) { rex[k]=rex[k]+workbuf[i]*cos(w*k*i); imx[k]=imx[k]-workbuf[i]*sin(w*k*i); } void IDFT()//Inverse Discret Fourier Transform function { for(k=0;k<=HalfWin;k++) { rex[k]=rex[k]/HalfWin; imx[k]=-imx[k]/HalfWin; } rex[0]=rex[0]/2; rex[HalfWin]=rex[HalfWin]/2; for(i=0;i<Window;i++) workbuf[i]=0; for(k=0;k<=HalfWin;k++) for(i=0;i<Window;i++) { workbuf[i]=workbuf[i]+rex[k]*cos(w*k*i); workbuf[i]=workbuf[i]+imx[k]*sin(w*k*i); } } void main() { Ввести массив workbuf; DFT(); IDFT(); //рассчитали прямое и обратное Фурье… Сигнал не изменился } |
| Автор: podval 21.2.2003, 04:34 | ||
На, поиграйся с моим БПФ
|
| Автор: Crait 21.2.2003, 09:32 |
| А выборку на оконную функцию домножать не пробовали ? - есть такие, имеющие колоколообразную форму. Используйте, скажем, окно Хэмминга - из наиболее известных. f = 0.54 - 0.46 * cos(x) |
| Автор: podval 21.2.2003, 16:47 | ||
И не только на Хэмминга |
| Автор: Iskanderus 1.3.2007, 07:29 |
| Уважаемый podval, в ваши функции исходный сигнал передается в виде complex<double> *sig Обяъсните, пожалуйста, каким образом этот сигнал превращается в массив комплексных чисел типа double? |
| Автор: podval 2.3.2007, 14:54 |
| В функцию передали указатель на массив. Далее делаем, что хотим. |