Реклама на сайте English version  DatasheetsDatasheets

KAZUS.RU - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Электронные книги
FAQ по электронике

  Datasheets
Поиск SMD
Он-лайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Избранные схемы
FAQ по электронике
  Программы
Каталог сайтов
Производители электроники
  Форумы по электронике
Помощь проекту

Цифровые сигнальные процессоры Вопросы, связанные с применением цифровых сигнальных процессоров: программирование, отладочные средства, алгоритмы...

 
Опции темы
Непрочитано 11.08.2015, 16:35  
zenekk
Частый гость
 
Регистрация: 05.05.2011
Сообщений: 16
Сказал спасибо: 1
Сказали Спасибо 2 раз(а) в 2 сообщении(ях)
zenekk на пути к лучшему
По умолчанию Дискретное преобразование фурье и амплитуда гармоник

Здравствуйте!
Есть сигнал который подвергается дискретному преобразованию фурье.
На выходе ДПФ есть мнимая и действительная части, корень из суммы квадратов которых есть амплитуда определенной частоты в сигнале.

Вот написал небольшую программку, которая генерирует сигнал и проводит над ним прямое преобразование фурье:

Код:
#include "stdafx.h"

#include ‹stdio.h›
#include ‹math.h›
#include ‹string.h›
#define PI 3.141592653589793238462643383279


#define SAMPLERATE 8000 
#define signal1_HZ 125  
#define signal2_HZ 375
#define DFT_SIZE 64     // êîëè÷åñòâî âûáîðîê äëÿ ÄÏÔ


signed char buff[SAMPLERATE];
float fbuf[SAMPLERATE];


void Generate (void)
{
    FILE* myfile;
    FILE* file; 
    int i;
    int ch;
    myfile = fopen("C:\\file.wav", "w"); 

    for(  i = 0; i ‹ SAMPLERATE ;i++)
	{
		
		fbuf[i]=64*((sin(2*PI*i*signal1_HZ/SAMPLERATE))+(sin(0.8+2*PI*i*signal2_HZ/SAMPLERATE))); // äâà ñèíóñà
		//fbuf[i]=42*((sin(2*PI*i*signal1_HZ/SAMPLERATE))+(sin(0.8+2*PI*i*signal2_HZ/SAMPLERATE))+(sin(2*PI*i*1500/SAMPLERATE))); // òðè ñèíóñà
		fputc((signed char)fbuf[i],myfile);
		//printf("%f\n",fbuf[i]); 
    } 

    fclose(myfile);
 
}


float Re[DFT_SIZE],Im[DFT_SIZE],Ampl[DFT_SIZE],summ=0;


int main(void)
{
	int i=0,j=0;

	Generate();

	for(i=0;i‹DFT_SIZE;i++){

		for(j=0;j‹DFT_SIZE;j++){
			Re[i]+=(float)fbuf[j]*cos(2*PI*i*j/DFT_SIZE);
			Im[i]-=(float)fbuf[j]*sin(2*PI*i*j/DFT_SIZE);
		}

		Ampl[i] = (float)sqrt(Re[i]*Re[i] + Im[i]*Im[i]);
	}


	for(i=0;i‹DFT_SIZE;i++){
		printf("Amp[%d]\t\t(%d Hz)\t = %f\n",i,(SAMPLERATE/DFT_SIZE)*i,Ampl[i]);
	}

	while(1);
	return 0;

}
Вот результат работы программы для сигнала - синус 125Гц + синус 375Гц:


А вот для просто синуса 375Гц:


Для понимания, вот сами сигналы:


Частота дискретизации сигнала - 8000Гц.
Теперь вопрос!
Как определить реальную амплитуду? В результатах работы программы амплитуда пляшет для двух синусов - по 2048 на частоту, для одного синуса - 4064 единиц. Что это за единицы? Как из привести к нормальному виду? И как из них получить в дб, какое значение принимать за 0Дб?
Реклама:

Последний раз редактировалось zenekk; 11.08.2015 в 16:38.
zenekk вне форума  
Непрочитано 11.08.2015, 19:34  
raxp
Почётный гражданин KAZUS.RU
 
Регистрация: 28.05.2010
Сообщений: 1,118
Сказал спасибо: 150
Сказали Спасибо 604 раз(а) в 310 сообщении(ях)
raxp на пути к лучшему
По умолчанию Re: Дискретное преобразование фурье и амплитуда гармоник

...не плодите темы.
__________________
Белорусский журнал «Радиолюбитель»
Youtube LaboratoryW
UR3QQJ
raxp вне форума  
Непрочитано 26.08.2015, 13:46  
Signalshik2
Вид на жительство
 
Аватар для Signalshik2
 
Регистрация: 11.08.2015
Сообщений: 408
Сказал спасибо: 17
Сказали Спасибо 37 раз(а) в 28 сообщении(ях)
Signalshik2 на пути к лучшему
По умолчанию Re: Дискретное преобразование фурье и амплитуда гармоник

Я тоже занимался Преобразованием Фурье кажется в прошлом году. Да есть там над чем попариться. В целом вывод такой, Преобразование Фурье работает, но у меня был гемор с зеркальными гармониками. Сингал раскладывается на: постоянную составляющую(0-я гармоника), основный гармоники и зеркальные гармоники.
Так вот, если я знаю какие частоты я подал, то я могу легко отличить основные и зеркальные гармоники. Так и есть, это четко видно. Но в радиотехнике часто есть задача, когда не знаешь сигнал и какие там зеркальные, а какие основные - не понятно.
Над Вашим вопросом подумаю еще, если будет что сказать, то скажу.
Signalshik2 вне форума  
Непрочитано 26.08.2015, 14:01  
Signalshik2
Вид на жительство
 
Аватар для Signalshik2
 
Регистрация: 11.08.2015
Сообщений: 408
Сказал спасибо: 17
Сказали Спасибо 37 раз(а) в 28 сообщении(ях)
Signalshik2 на пути к лучшему
По умолчанию Re: Дискретное преобразование фурье и амплитуда гармоник

А ну все, я понял. Там все работает.
На первой картинке:
Основные гармоники:
125 Гц = 2048 ед.
375 Гц = 2048 ед.
Зеркальные гармоники:
7625 Гц = 2048 ед.
7875 Гц = 2048 ед.
На второй картинке:
Основная гармоника:
375 Гц = 4064 ед.
Зеркальная гармоника:
7625 Гц = 4064 ед.

Я не знаю в каких единицах получается амплитуда, но осмелюсь предположить, что все идет от частоты дискретизации.
8000 Гц - частота дискретизации и столько единиц он раскидывает на все гармоники. Т.е. если там 4 гармоники, то получается всем по 2000,
а если 2 гармоники, то получается всем по 4000.

Скажите пожалуйста какие сигналы после этой фразы:
Сообщение от zenekk Посмотреть сообщение
Для понимания, вот сами сигналы:
Я так понял там 2 графика. Верхний - сумма 125 Гц + 375 Гц.
Нижний - только 375 Гц.
Signalshik2 вне форума  
Непрочитано 27.08.2015, 12:48  
Signalshik2
Вид на жительство
 
Аватар для Signalshik2
 
Регистрация: 11.08.2015
Сообщений: 408
Сказал спасибо: 17
Сказали Спасибо 37 раз(а) в 28 сообщении(ях)
Signalshik2 на пути к лучшему
По умолчанию Re: Дискретное преобразование фурье и амплитуда гармоник

Ваш код на самом деле очень простой:
for(i=0;i‹DFT_SIZE;i++){

for(j=0;j‹DFT_SIZE;j++){
Re[i]+=(float)fbuf[j]*cos(2*PI*i*j/DFT_SIZE);
Im[i]-=(float)fbuf[j]*sin(2*PI*i*j/DFT_SIZE);
}

Ampl[i] = (float)sqrt(Re[i]*Re[i] + Im[i]*Im[i]);
}
Я разбирался с алгоритмом, там было очень сложно.
Поделитесь, пожалуйста, секретом, где взяли такой алгоритм? Можете привести сам алгоритм.
Для наглядности я бы еще сделал графическое представление гармоник - так сразу станет видно, где какая гармоника.
И для полной картины я бы еще добавил фазовую характеристику.
И еще хотел спросить в какой версии Microsoft Visual Studio пишете? 2015?

Последний раз редактировалось Signalshik2; 27.08.2015 в 13:21.
Signalshik2 вне форума  
Непрочитано 04.10.2015, 18:11  
projects.org.ua
Заблокирован
 
Регистрация: 15.10.2010
Адрес: Kiev/Kharkov
Сообщений: 133
Сказал спасибо: 15
Сказали Спасибо 21 раз(а) в 21 сообщении(ях)
projects.org.ua на пути к лучшему
По умолчанию Re: Дискретное преобразование фурье и амплитуда гармоник

Вот тут есть интересная дискуссия про FFT, с рабочими кодами примеров http://www.projects.org.ua/forum/vie...hp?f=41&t=3578
projects.org.ua вне форума  
Непрочитано 03.12.2015, 11:01  
Signalshik2
Вид на жительство
 
Аватар для Signalshik2
 
Регистрация: 11.08.2015
Сообщений: 408
Сказал спасибо: 17
Сказали Спасибо 37 раз(а) в 28 сообщении(ях)
Signalshik2 на пути к лучшему
По умолчанию Re: Дискретное преобразование фурье и амплитуда гармоник

Теория не всегда проигрывает. Почему автор данной темы мне не отвечает?
Signalshik2 вне форума  
Непрочитано 04.12.2015, 16:41  
Signalshik2
Вид на жительство
 
Аватар для Signalshik2
 
Регистрация: 11.08.2015
Сообщений: 408
Сказал спасибо: 17
Сказали Спасибо 37 раз(а) в 28 сообщении(ях)
Signalshik2 на пути к лучшему
По умолчанию Re: Дискретное преобразование фурье и амплитуда гармоник

Я сделал свой вариант исполнения программы, которую привел автор. Интересно как?
Signalshik2 вне форума  
 

Закладки
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход


Часовой пояс GMT +4, время: 06:12.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot