Цифровые сигнальные процессоры Вопросы, связанные с применением цифровых сигнальных процессоров: программирование, отладочные средства, алгоритмы... |
11.08.2015, 16:35
|
|
Частый гость
Регистрация: 05.05.2011
Сообщений: 16
Сказал спасибо: 1
Сказали Спасибо 2 раз(а) в 2 сообщении(ях)
|
Дискретное преобразование фурье и амплитуда гармоник
Здравствуйте!
Есть сигнал который подвергается дискретному преобразованию фурье.
На выходе ДПФ есть мнимая и действительная части, корень из суммы квадратов которых есть амплитуда определенной частоты в сигнале.
Вот написал небольшую программку, которая генерирует сигнал и проводит над ним прямое преобразование фурье:
Код:
|
#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.
|
|
|
|
11.08.2015, 19:34
|
|
Почётный гражданин KAZUS.RU
Регистрация: 28.05.2010
Сообщений: 1,118
Сказал спасибо: 150
Сказали Спасибо 604 раз(а) в 310 сообщении(ях)
|
Re: Дискретное преобразование фурье и амплитуда гармоник
...не плодите темы.
|
|
|
|
26.08.2015, 13:46
|
|
Вид на жительство
Регистрация: 11.08.2015
Сообщений: 408
Сказал спасибо: 17
Сказали Спасибо 37 раз(а) в 28 сообщении(ях)
|
Re: Дискретное преобразование фурье и амплитуда гармоник
Я тоже занимался Преобразованием Фурье кажется в прошлом году. Да есть там над чем попариться. В целом вывод такой, Преобразование Фурье работает, но у меня был гемор с зеркальными гармониками. Сингал раскладывается на: постоянную составляющую(0-я гармоника), основный гармоники и зеркальные гармоники.
Так вот, если я знаю какие частоты я подал, то я могу легко отличить основные и зеркальные гармоники. Так и есть, это четко видно. Но в радиотехнике часто есть задача, когда не знаешь сигнал и какие там зеркальные, а какие основные - не понятно.
Над Вашим вопросом подумаю еще, если будет что сказать, то скажу.
|
|
|
|
26.08.2015, 14:01
|
|
Вид на жительство
Регистрация: 11.08.2015
Сообщений: 408
Сказал спасибо: 17
Сказали Спасибо 37 раз(а) в 28 сообщении(ях)
|
Re: Дискретное преобразование фурье и амплитуда гармоник
А ну все, я понял. Там все работает.
На первой картинке:
Основные гармоники:
125 Гц = 2048 ед.
375 Гц = 2048 ед.
Зеркальные гармоники:
7625 Гц = 2048 ед.
7875 Гц = 2048 ед.
На второй картинке:
Основная гармоника:
375 Гц = 4064 ед.
Зеркальная гармоника:
7625 Гц = 4064 ед.
Я не знаю в каких единицах получается амплитуда, но осмелюсь предположить, что все идет от частоты дискретизации.
8000 Гц - частота дискретизации и столько единиц он раскидывает на все гармоники. Т.е. если там 4 гармоники, то получается всем по 2000,
а если 2 гармоники, то получается всем по 4000.
Скажите пожалуйста какие сигналы после этой фразы:
Сообщение от zenekk
|
Для понимания, вот сами сигналы:
|
Я так понял там 2 графика. Верхний - сумма 125 Гц + 375 Гц.
Нижний - только 375 Гц.
|
|
|
|
27.08.2015, 12:48
|
|
Вид на жительство
Регистрация: 11.08.2015
Сообщений: 408
Сказал спасибо: 17
Сказали Спасибо 37 раз(а) в 28 сообщении(ях)
|
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.
|
|
|
|
04.10.2015, 18:11
|
|
Заблокирован
Регистрация: 15.10.2010
Адрес: Kiev/Kharkov
Сообщений: 133
Сказал спасибо: 15
Сказали Спасибо 21 раз(а) в 21 сообщении(ях)
|
Re: Дискретное преобразование фурье и амплитуда гармоник
Вот тут есть интересная дискуссия про FFT, с рабочими кодами примеров http://www.projects.org.ua/forum/vie...hp?f=41&t=3578
|
|
|
|
03.12.2015, 11:01
|
|
Вид на жительство
Регистрация: 11.08.2015
Сообщений: 408
Сказал спасибо: 17
Сказали Спасибо 37 раз(а) в 28 сообщении(ях)
|
Re: Дискретное преобразование фурье и амплитуда гармоник
Теория не всегда проигрывает. Почему автор данной темы мне не отвечает?
|
|
|
|
04.12.2015, 16:41
|
|
Вид на жительство
Регистрация: 11.08.2015
Сообщений: 408
Сказал спасибо: 17
Сказали Спасибо 37 раз(а) в 28 сообщении(ях)
|
Re: Дискретное преобразование фурье и амплитуда гармоник
Я сделал свой вариант исполнения программы, которую привел автор. Интересно как?
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 00:42.
|
|