FFT, Интерпретация результата преобразования

Аватара пользователя
Бахурин Сергей
Администратор
Сообщения: 893
Зарегистрирован: 05 окт 2010, 19:55
Контактная информация:

Re: FFT, Интерпретация результата преобразования

Сообщение Бахурин Сергей » 30 мар 2015, 14:18

Думаю что если Ts поставить как 2048 то все станет хорошо

Аватара пользователя
Santik
Сообщения: 609
Зарегистрирован: 28 дек 2010, 08:04
Откуда: Мирный (Якутия)
Контактная информация:

Re: FFT, Интерпретация результата преобразования

Сообщение Santik » 30 мар 2015, 18:15

А что, Ts в этой подпрограмме равен (число комплексных коэффициентов)*2 :lol: :lol: :lol:
Хорошо, что у меня МатЛаба нет :mrgreen:

Seges
Сообщения: 9
Зарегистрирован: 29 мар 2015, 11:52

Re: FFT, Интерпретация результата преобразования

Сообщение Seges » 30 мар 2015, 18:55

Бахурин Сергей писал(а):Думаю что если Ts поставить как 2048 то все станет хорошо
Добрый день, Сергей.
Картина не изменилась совершенно.
Santik писал(а):А что, Ts в этой подпрограмме равен (число комплексных коэффициентов)*2 :lol: :lol: :lol:
Хорошо, что у меня МатЛаба нет :mrgreen:
Извините, не понял высказывание. Что не так?

Аватара пользователя
Santik
Сообщения: 609
Зарегистрирован: 28 дек 2010, 08:04
Откуда: Мирный (Якутия)
Контактная информация:

Re: FFT, Интерпретация результата преобразования

Сообщение Santik » 30 мар 2015, 19:34

Nuv_exam_signal - это двумерный массив? По крайней мере я так понял из распечатки -
там идет:
число, 0.,число, 0., ....
Может эти данные использовать (очищенные):
222.rar
(10.36 КБ) 240 скачиваний

Seges
Сообщения: 9
Зарегистрирован: 29 мар 2015, 11:52

Re: FFT, Интерпретация результата преобразования

Сообщение Seges » 31 мар 2015, 12:29

Nuv_exam_signal - массив одномерный, это семплы АЦП. Такой вот сигнал.
Да и потом, в микроконтроллере БПФ рассчитывает, полученный результат соответствует описанию примера в файле помощи к библиотеке.
Точно такой же результат получили вы - максимум амплитуды на точке 213 в массиве после преобразования и зеркальное отображение спектра, все честно.

А вот MATLAB дает вообще непонятные результаты, при чем, если вырезать все лишнее, так сказать, в лоб, то картина спектра соответствует спектру из примера.
Сказать, что MATLAB делает что-то не так, не могу, так как сперва повторял пример описанный на http://habrahabr.ru/post/196374/, получилось все как в примере.

Основной вопрос - почему получается четыре зеркальных друг другу спектра, причем основной спектр имеет зеркальный и потом еще имеем зеркальное отображение это пары (основного и зеркального)?

Я сегодня попробую вставить и прогнать почищенный вами массив, может, что-то поменяется.

Сергей, вы не пробовали у себя мой скрипт, повторилась ли картина?

Аватара пользователя
Santik
Сообщения: 609
Зарегистрирован: 28 дек 2010, 08:04
Откуда: Мирный (Якутия)
Контактная информация:

Re: FFT, Интерпретация результата преобразования

Сообщение Santik » 31 мар 2015, 13:03

Ну, всё понятно ! :D
Исходные данные были комплексные, мнимая часть каждой выборки =0
Поэтому в данных каждое второе значение = 0.
Я вот тоже Нулями свой файл разбавил (через выборку) и получил:
Сигнал2.JPG

Seges
Сообщения: 9
Зарегистрирован: 29 мар 2015, 11:52

Re: FFT, Интерпретация результата преобразования

Сообщение Seges » 31 мар 2015, 22:07

Добрый вечер, спасибо большое за помощь.
Теперь все встало на места.
Массив действительно комплексный.
Теперь разбираюсь почему как странно записываются комплексный числа в массив.
Теперь понятно почему в примере программы для микроконтроллера функция БПФ называется cfft(); - преобразование для комплексных чисел.
Спасибо!

Андрей33
Сообщения: 12
Зарегистрирован: 01 окт 2015, 16:29

Re: FFT, Интерпретация результата преобразования

Сообщение Андрей33 » 02 окт 2015, 09:00

Доброе утро.
У меня похожая проблема.

Код: Выделить всё

void main()
{
	while(1)
	{//while_ON
                 if(IRQFLAG & 0x04)
                 {
                 buff_adc_dac1[0] = ADCREG;//считываем значение с АЦП(Q15)
	         DACREG =buff_adc_dac1[0];//записываем значение в ЦАП(Q15)
	         _buff[schet]=buff_adc_dac1[0];
        	  schet++;
        	  _buff[schet]=0;
        	  schet++;
	                if(schet>=128)
	                {
                         cbrev(_buff,_buff,64);//Битреверсное переупорядочивание комплексных чисел из DSPlib
                         сfft(_buff,64,1);//Прямое комплексное БПФ из DSPlib
                         schet=0;
                        }
                   } 
	}//while_OFF	
} 
Fd=8k
При подаче с генератора на вход АЦП синуса 250Гц, вижу пики после БПФ в точках: 4; 12; 20; 28; 36; 44; 52; 60.
При подаче с генератора на вход АЦП синуса 500Гц, вижу пики после БПФ в точках: 8; 24; 40; 56.
При подаче с генератора на вход АЦП синуса 1000Гц, вижу пики после БПФ в точках: 16; 48.
При подаче с генератора на вход АЦП синуса 1500Гц, вижу пики после БПФ в точках: 8; 24; 40; 56.
При подаче с генератора на вход АЦП синуса 2000Гц, вижу пики после БПФ в точках: 32.
Если подаю больше 2кГц - пиков нет.

В чем может быть проблема?

В описании на функцию cbrev написано: "Входные данные должны быть выровнены по границе 2*nx
(log(nx) + 1 LSB должны быть нулевыми)" - не понимаю, что это.

Аватара пользователя
Santik
Сообщения: 609
Зарегистрирован: 28 дек 2010, 08:04
Откуда: Мирный (Якутия)
Контактная информация:

Re: FFT, Интерпретация результата преобразования

Сообщение Santik » 02 окт 2015, 11:28

cbrev(_buff,_buff,64);//Битреверсное переупорядочивание комплексных чисел из DSPlib
А что такое 64? Только половину массива переупорядочиваем?

Я бы на первом этапе работу АЦП эмулировал.

А... понял - буфер 64 комплексных значений :D

Андрей33
Сообщения: 12
Зарегистрирован: 01 окт 2015, 16:29

Re: FFT, Интерпретация результата преобразования

Сообщение Андрей33 » 02 окт 2015, 11:47

Santik писал(а):
cbrev(_buff,_buff,64);//Битреверсное переупорядочивание комплексных чисел из DSPlib
А что такое 64? Только половину массива переупорядочиваем?

Я бы на первом этапе работу АЦП эмулировал.
Функция комплексная, поэтому NX/2.
Я проверял значения в памяти, она делает реверсию адресов отдельно для четных и нечетных элементов массива, на выходе 128 значений получается.
Вот этот (log(nx) + 1 LSB меня еще смущает.

На вход АЦП подаю синус, на выходе DAC его же вижу без искажений.
Пробовал заменить АЦП заранее подготовленным массивом данных - результат такойже.

Ответить

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость