Перейти к содержанию
    

Спектральный анализ Фурье

1 hour ago, my504 said:

Не может ли мне кто нибудь предложить калькулятор поворачивающих коэффициентов для БПФ? А лучше генератор графа БПФ при задании размера входного массива.

Даа.. Уровень квалификации местных "экспертов" упал ниже плинтуса..

Про MATLAB и Visual Studio вы, похоже, даже не слышали..

:biggrin:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 hours ago, Xenia said:

А я-то что вам говорю? Что именно обработка узким окном во временной области и является их ПРИЧИНОЙ. Не курочьте сигнал во временной области, а обрабатывайте его В ЧАСТОТНОЙ ОБЛАСТИ - и не будет у вас никаких лепестков. Для того и Фурье применяют..

Ксения, не расстраивайте меня... Вы не слышите о чем я Вам говорю. Окно во временной области определяет ПОЛОСУ ОДНОГО ФИЛЬТРА. И не может быть изменено произвольным образом. Это окно (речь конечно о прямоугольном) и создает эти самые лепестки, а точнее паразитные каналы приема ДЛЯ КАЖДОГО ФИЛЬТРА в Фурье. Пусть ближайший лепесток будет на частоте сдвинутой от центральной частоты фильтра на 1 кГц. Тогда сигнал на этой самой сдвинутой на 1 кГц от фильтра частоте будет принят этим фильтром так, как будто он попал прямо в фильтр (с учетом подавления на этом лепестке, конечно). Какое еще окно в частотной области? Вы вообще о чем? У паразитного сигнала в этом боковом лепестке такой спектр РЕАЛЬНО СУЩЕСТВУЕТ. Вы хоть обнакладывайтесь окнами в частотной области, бин будет принимать частоты в своем боковом лепестке.

А если обработать оптимальным окном во временной области, то это приведет к подавлению этих спектральных компонент и никаких "ушей" у АЧХ фильтров уже не будет.

1 hour ago, blackfin said:

Даа.. Уровень квалификации местных "экспертов" упал ниже плинтуса..

Про MATLAB и Visual Studio вы, похоже, даже не слышали..

:biggrin:

Милостивый государь, я канешна понимаю повод по которому Вы тут щеритесь, но от этого Ваше поведение не становится умнее. Я не спрашивал ничего про МАТЛАБ. Я и без вас знаю про МАТЛАБ. Но у меня на работе не стоит МАТЛАБ, по простой и очевидной причине. Мы не используем нелицензионное ПО под страхом увольнения. Даже файлов из сред, на которые нет законной лицензии на рабочих компьютерах нет. А характер решаемых мною задач не требует МАТЛАБа. Даже там, где МАТЛАБ был бы целесообразен с технической точки зрения, он не целесообразен с финансовой. 

Поэтому мне нужен именно калькулятор и желательно онлайн, а не проприетарный резидентный софт. 

Я достаточно понятно изложил мотивы моей просьбы, любезный?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Есть же Octave  и NumPy. 

Шеф конторы ваш видать бывший уголовник. А если еще и не пьете на корпоративах - то и алкоголик :D

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Октав я  попробую. Если там есть требуемый мне генератор, то буду использовать. Сама среда для собственно тестовых расчетов мне нужна крайне редко.

Такова специфика разработок. По сути, во всех изделиях используется одинаковый тип принимаемого сигнала, а методы его приема в линейной части обработки не требуют ничего кроме FIR или IIR (ну и  DFT, конечно). Нелинейную фильтрацию я тестирую прямо на железе, поскольку при симуляции практически невозможно создать специфические помехи. Да и быстрее проверить на железе.

 

ЗЫ. Пока предметно не разобрался, просто потестил обычной арифметикой, но в Октаве я не нашел бокса как в МАТЛАБе со специальными тулзами для генерации фильтров и прочих ништяков. Мне ведь не библиотека с ФФТ нужна. Мне нужно написать код на АСМе для FFT длиной 1К под dsPIC33CH. Свой код, а не библиотечный из Микрочиповского dsplib.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 hour ago, DASM said:

Шеф конторы ваш видать бывший уголовник. А если еще и не пьете на корпоративах - то и алкоголик :D

Вы просто не в теме относительно тенденций на эту тему.  Есть юр.конторы, которые заключают с правообладателями договоры и ищут тех "юриков", которые не брезгуют контрафактом. Затем приходят с ментами и дают на выбор два варианта - либо заплатить им, либо государству и правообладателю.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

9 hours ago, my504 said:

Вы просто не в теме относительно тенденций на эту тему.

Это вы не в теме: Visual Studio

 

11 hours ago, my504 said:

Мне нужно написать код на АСМе для FFT длиной 1К

Считайте sin/cos в Excel'е..

Excel то у вас есть? 

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

4 minutes ago, blackfin said:

Это вы не в теме

И что? Какое это имеет отношение к моей просьбе? Если Вы знаете встроенный инструмент в бесплатном ПО, который мне сгенерирует граф БПФ, то так и скажите. Не нужно меня отчитывать за то, что у меня не стоит софт, который мне по роду работы не нужен. Даже если он бесплатен. Я не программист. Я радиоинженер. Мои нынешние задачи требуют вполне определенных знаний и навыков. Когда мне их не хватает, я обращаюсь к поисковикам и к сообществу. ЧЯДНТ?

ЗЫ. Задачи разработки я решаю в достаточном для этой ниши качестве. Уверяю Вас.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

11 minutes ago, my504 said:

Если Вы знаете встроенный инструмент в бесплатном ПО

К сожалению, я не знаю. Но в порядке так сказать помощи))) Поглядите scilab. Он даром. Может быть там найдёте нужный инструмент.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

26 minutes ago, blackfin said:

Считайте sin/cos в Excel'е..

Да уж... Любезный, как перевести алгебраическую форму комплексного числа в экспоненциальную и наоборот я знаю. Мой вопрос заключался не в расчете коэффициентов, а в самом графе. То есть мне нужны номера коэффициентов и их расстановка в графе.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

5 minutes ago, my504 said:

То есть мне нужны номера коэффициентов и их расстановка в графе.

"Может, вам ещё и ключ от квартиры где деньги лежат?" :biggrin:

 

5 minutes ago, my504 said:

Мой вопрос заключался не в расчете коэффициентов, а в самом графе.

Напомню:

5 hours ago, my504 said:

Не может ли мне кто нибудь предложить калькулятор поворачивающих коэффициентов для БПФ?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

35 minutes ago, blackfin said:

"Может, вам ещё и ключ от квартиры где деньги лежат?" :biggrin:

Напомню:

 

Милостивый государь, а давайте Вы не будете кривляться и делать вид что ничего не поняли? Вы выдернули цитату из контекста, обрезав следующее за ней предложение.

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

Я Вас услышал. И даже сделал выводы. :bye:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

4 minutes ago, my504 said:

Вы прямо сказали мне о том, что граф БПФ не является тривиальной сущностью и требует неких трудов по его созданию.

Не знаю, о чем вы тут трындите.. :biggrin:

Я делал БПФ на 2^3, ..., 2^20 точек на С++ для PC, на ассемблере для blackfin'а и на Verilog'е для FPGA.

Никаких графов для 2^20 точек я не рисовал..

Учите матчасть! :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

4 minutes ago, blackfin said:

Я делал БПФ на 2^3, ..., 2^20 точек на С++ для PC, на ассемблере для blackfin'а и на Verilog'е для FPGA.

Никаких графов для 2^20 точек я не рисовал..

О! Отлично! Вы то мне и нужны... )))

Есть куча литературы по БПФ в которой в качестве примера приведены графы для 8-ми, максимум для 16-ти точечного БПФ. Есть стандартная общеизвестная формула самой бабочки, в которой индексы поворачивающего коэффициента (угла) привязаны к номеру отсчета.

ЛИЧНО У МЕНЯ, возможно в силу туповатости и/или возраста (мне 61-ый пошел) возникли сложности с вычислением этого самого угла через текущий счетчик итераций.

И я обратился сюда. 

Посылать меня учить матчасть не надо. Иначе я пошлю Вас. Довольно далеко.

Спасибо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

кусок кода, детектирующий гармоники в составе сигнала
Спойлер

public ArrayList<SynthesizableSignal> detectHarmonics() {
    SignalCutter cutter = new SignalCutter(source, new Signal(source));
    SynthesizableComplexExponent heterodinParameter = new SynthesizableComplexExponent();
    heterodinParameter.setProperty("frequency", 0.0);
    Signal heterodin = new Signal(source.getLength());
    Signal heterodinedSignal = new Signal(cutter.getCurrentSignal());
    Spectrum spectrum = new Spectrum(heterodinedSignal);
    int harmonic;
    while ((harmonic = spectrum.detectStrongPeak(min)) != -1) {
        if (cutter.getCuttersCount() > 10)
            throw new RuntimeException("Unable to analyze signal! Try another parameters.");
        double heterodinSelected = 0.0;
        double signalToNoise = spectrum.getRealAmplitude(harmonic) / spectrum.getAverageAmplitudeIn(harmonic, windowSize);
        for (double heterodinFrequency = -0.5; heterodinFrequency < (0.5 + heterodinAccuracy); heterodinFrequency += heterodinAccuracy) {
            heterodinParameter.setProperty("frequency", heterodinFrequency);
            heterodinParameter.synthesizeIn(heterodin);
            heterodinedSignal.set(cutter.getCurrentSignal()).multiply(heterodin);
            spectrum.recalc();
            double newSignalToNoise = spectrum.getRealAmplitude(harmonic) / spectrum.getAverageAmplitudeIn(harmonic, windowSize);
            if (newSignalToNoise > signalToNoise) {
                signalToNoise = newSignalToNoise;
                heterodinSelected = heterodinFrequency;
            }
        }
        SynthesizableCosine parameter = new SynthesizableCosine();
        heterodinParameter.setProperty("frequency", heterodinSelected);
        heterodinParameter.synthesizeIn(heterodin);
        heterodinedSignal.set(cutter.getCurrentSignal()).multiply(heterodin);
        spectrum.recalc();
        parameter.setProperty("amplitude", MathHelper.adaptiveRound(spectrum.getRealAmplitude(harmonic)));
        parameter.setProperty("frequency", harmonic - heterodinSelected);
        parameter.setProperty("phase", MathHelper.round(spectrum.getPhase(harmonic), 1));
        cutter.addSignal(parameter);
        cutter.cutNext();
        heterodinedSignal.set(cutter.getCurrentSignal());
        spectrum.recalc();
    }
    return cutter.getSignalsParameters();
}

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...