ViKo 1 2 октября, 2013 Опубликовано 2 октября, 2013 · Жалоба Хочу задать несколько разных оконных функций при вычислении БПФ в своем устройстве. И уже на треугольном озадачился. Возьмем для простоты БПФ по 8 точкам. Трегольное окно спадает от 1 в середине до 0 на краях. Какой отсчет будет умножен на 1 - 3-й, 4-й, оба, никакой? Ведь вершина треугольника попадает между отсчетами - слева 4 и справа 4. Понятно, что при 1024 точках это почти не важно, но все равно напрягает. Тот же вопрос распространяется и на все остальные окна. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ivan219 0 2 октября, 2013 Опубликовано 2 октября, 2013 (изменено) · Жалоба Я так думаю что вот так -> 0 1 2 3 4 3 2 1 или так -> 1 2 3 4 3 2 1 0 будет правильно. Изменено 2 октября, 2013 пользователем ivan219 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 2 октября, 2013 Опубликовано 2 октября, 2013 · Жалоба Вот здесь что-то пишут, но не могу понять, что. :rolleyes: http://en.wikipedia.org/wiki/Window_function Симметричное окно мне нравится больше. И на 0 крайнюю точку умножать... жалко. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
semperante 0 3 октября, 2013 Опубликовано 3 октября, 2013 · Жалоба На ноль умножать и не надо. Для этих целей всегда пользуюсь Матлабом. Например, для 8-точечного окна матлаб-функция triang(8) выдаёт следующие коэффициенты: 0.1250 0.3750 0.6250 0.8750 0.8750 0.6250 0.3750 0.1250. Там же, в справке есть и формулы для всех окон. Для треугольного, кстати, они разные для чётного и нечётного количества точек. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
V_G 7 3 октября, 2013 Опубликовано 3 октября, 2013 · Жалоба 2 ViKo: Вам точно нужно именно БПФ? Дело в том, что БПФ становится "быстрым" в сравнении с классическим ДПФ при числе точек > 64. Зачем вообще вычислять спектр (через ДПФ или БПФ) по 8 точкам? А если точек много, то умножать на 0 по краям не жалко. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
thermit 1 3 октября, 2013 Опубликовано 3 октября, 2013 · Жалоба V_G: Дело в том, что БПФ становится "быстрым" в сравнении с классическим ДПФ при числе точек > 64. Это вы погорячились... Даже для 4-х точек бпф быстрое в сравнении с явным дпф. Вообще-то для любого числа точек >2 можно построить алгоритм, который будет быстрее явного дпф. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 3 октября, 2013 Опубликовано 3 октября, 2013 · Жалоба БПФ быстрее ДПФ. 8 точек - это только для примера. Делаю на 1024 (в принципе, #define пределяет). Для этих целей всегда пользуюсь Матлабом. Например, для 8-точечного окна матлаб-функция triang(8) выдаёт следующие коэффициенты: ... Там же, в справке есть и формулы для всех окон. Для треугольного, кстати, они разные для чётного и нечётного количества точек. Такие коэффициенты и выбрал, симметричные. Мне не нужно их в виде таблицы иметь. Пусть микроконтроллер сам вычисляет по формуле (уже вычисляет, но я еще не смотрел результаты). Возникает вопрос, какой же коэффициент (как он там называется, ослабления?) получается при использовании окон. upd. Ага, сложить все к-ты и поделить на размер БПФ. Так, похоже... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
semperante 0 3 октября, 2013 Опубликовано 3 октября, 2013 · Жалоба Вот готовая формула, которую использует Матлаб, для расчёта треугольного окна: http://www.mathworks.com/help/signal/ref/t...ighlight=triang Здесь можно найти формулы для других окон: http://www.mathworks.com/help/signal/windows.html Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Alex11 5 3 октября, 2013 Опубликовано 3 октября, 2013 · Жалоба По поводу коэффициента при использовании окна. там, поскольку энергия, как я помню, cумма квадратов коэффициентов окна должна быть равна 1, чтобы окно не влияло. Если не получится - напишите в личку, я в свое время это делал точно, посмотрю материалы старинные. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Ruslan1 17 3 октября, 2013 Опубликовано 3 октября, 2013 · Жалоба Я вот такое использую. Коэффициент альфа и форму окна подбирал в матлабе во время анализа реальных данных, характерных для исследуемого сигнала. Думаю, принцип понятен. %% windowing alpha = 4.05 for i=1:FFT_N_SAMPLES %Gaussian: tmp_n = abs(i - (FFT_N_SAMPLES)/2); tmp = alpha * tmp_n / (FFT_N_SAMPLES/2); coeff = exp(-0.5 * tmp*tmp); data_win(i) = data_in(i) * coeff; end Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 4 октября, 2013 Опубликовано 4 октября, 2013 · Жалоба Сделал, что мог. Использую Matlab. Окна по умолчанию получаются симметричными, что мне нравится. Результат расчетов выводится в файл, который включу в проект. Только запятую лишнюю в конце каждого массива нужно удалить. FFT_N = 8; WindHann = hann(FFT_N); WindHamm = hamming(FFT_N); WindBart = bartlett(FFT_N); fid = fopen('FFT_Windows.h', 'w'); fprintf(fid, '/* Hann Window */\n'); fprintf(fid, 'static const float WindHann[] = {\n'); fprintf(fid, ' %E, %E, %E, %E,\n', WindHann); fprintf(fid, '};\n\n'); fprintf(fid, '/* Hamming Window */\n'); fprintf(fid, 'static const float WindHamm[] = {\n'); fprintf(fid, ' %E, %E, %E, %E,\n', WindHamm); fprintf(fid, '};\n\n'); fprintf(fid, '/* Bartlett Window */\n'); fprintf(fid, 'static const float WindBart[] = {\n'); fprintf(fid, ' %E, %E, %E, %E,\n', WindBart); fprintf(fid, '};\n\n'); fclose(fid); Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mdmitry 0 4 октября, 2013 Опубликовано 4 октября, 2013 · Жалоба Можно отказаться от правильного использования MATLAB и сделать явный цикл по выводу каждого элемента массива или в строку нескольких элементов. И проверку на открытие файлов лучше делать. Рабочий порезаный пример вывода: clc clear DataLength = 64; fdirstr = 'C:\\tmp\\'; filestr = 'data'; fileextstr = '.h'; datafname = strcat(fdirstr,filestr,fileextstr); [fid1,message] = fopen(datafname,'w'); if fid1 == -1 errordlg(message,'FILE OPEN ERROR'); else fprintf(fid1,'/***********************************************************/'); fprintf(fid1,'\n/* Date: %s*/',datestr(now,0)); fprintf(fid1,'\n/***********************************************************/\n'); str = strcat(filestr,'_H_'); fprintf(fid1,'\n#ifndef %s',upper(str)); fprintf(fid1,'\n#define %s\n',upper(str)); fprintf(fid1,'\nconst uint32_t data[%i] = \n\t{',DataLength); for i=1:DataLength % здесь вывод того, что требуется, для примера поэлементно. fprintf(fid1,'\n\t\t0x%04X',i); % немного сложнее будет с расчетом необходимых индексов и форматом при выводе нескольких элементов массива в одной строке if i ~= DataLength fprintf(fid1,','); end end fprintf(fid1,'\n\t};\n\n'); fprintf(fid1,'#endif /* %s */\n',upper(str)); end if fid1 ~= -1 status = fclose(fid1); if status == -1 errstr = strcat('Can not close file: ',datafname); errordlg(errstr,'FILE CLOSE ERROR'); end end Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andrewn 0 6 октября, 2013 Опубликовано 6 октября, 2013 · Жалоба Трегольное окно спадает от 1 в середине до 0 на краях. Какой отсчет будет умножен на 1 - 3-й, 4-й, оба, никакой? Ведь вершина треугольника попадает между отсчетами - слева 4 и справа 4. Понятно, что при 1024 точках это почти не важно, но все равно напрягает. Тот же вопрос распространяется и на все остальные окна.Hi there :) Это писофкейк! :) Симметричная функция, по определению, обладает свойством f(x) = f(-x), для сдвинутого на (N-1)/2 интервала и целых x это свойство симметрии станет просто f(k) = f(N-k-1). Отсюда, при N=8, следует что f(3) = f(4), а в случае нечётного N есть единственный индекс без пары, k = (N-1)/2. Оконная функции вовсе не обязательно должна обнуляться на границе интервала; достаточно быть нормированной, что бы мощность сигнала не менялясь, т.е. SUM(k=0, N-1) w(k) = 1. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 6 октября, 2013 Опубликовано 6 октября, 2013 · Жалоба Оконная функции вовсе не обязательно должна обнуляться на границе интервала; достаточно быть нормированной, что бы мощность сигнала не менялясь, т.е. SUM(k=0, N-1) w(k) = 1. Все оконные функции БПФ приближаются к 1 в середине диапазона, и к 0 на краях (чтобы ослабить разрывы). Почему сразу не нормируются, как вы предлагаете? - видимо, из-за того, что числа слишком малыми становятся. Сейчас, для плавающей запятой это уже не важно... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andrewn 0 6 октября, 2013 Опубликовано 6 октября, 2013 · Жалоба Все оконные функции БПФ приближаются к 1 в середине диапазона, и к 0 на краях (чтобы ослабить разрывы). Почему сразу не нормируются, как вы предлагаете? - видимо, из-за того, что числа слишком малыми становятся. Сейчас, для плавающей запятой это уже не важно...К нулю по краям - для ослабления боковых лепестков, задавить sinc() от прямоугольного окна. Формула нормировки - я её в математическом смысле имел, а так, при работе с фиксированной точкой, конечно, имеет смысл сохранять как можно больше битиков в промежуточных числах, а нормировать и округлять в самом конце. Консенсус. :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться