Що це дає?
Це дозволяє візуально оцінити зміни у характері (спектрі) сигналу з часом, тобто свого роду мініархів REALTIME перед очима. Таким чином, наприклад, легко виявити частотну модуляцію, нестабільність опорнику передавача або навіть передавати повідомлення картинкою
Невеликий екскурс в основи
Пояснимо термін «градієнтна за кольором». Спектр – це розподіл енергії за частотою, що характеризується розкладанням у ряді Фур'є сигналу з такими характеристиками кожної гармоніки як частота та амплітуда. Уявіть ці дані у вигляді двох одномірних лінійних масивів однакової розмірності. З частотами все зрозуміло, у водоспаді вони задають положення мітки (точки) по-горизонталі, по-вертикалі ж положення всіх цих точок буде в даний конкретний момент часу завжди однаковим (саме тому масив і одномірний). Але як розрізнити ці точки (пікселі) одна від одної, якщо вони на одному рівні? Колір. Адже ми можемо керувати кольором кожного пікселя. Уявіть собі, що ми зіставили якесь мінімальне значення амплітуди якомусь початковому кольору, а максимальне деякому кінцевому кольору і тому співвідношення (Am до Amax) задаємо колір конкретному пікселю частоти по його амплітуді, ось така каша.
Градієнт – вид заливки в комп'ютерній графіці, в якій необхідно задати колір та прозорість певних точок, а колір та прозорість інших точок розраховуються щодо них за математичними алгоритмами, що дає можливість отримувати плавні переходи з одного кольору до іншого, задавши координати та колір початкової та кінцевої точок
// виділення R-складовоїфункція GetRValue(rgb: DWORD): Byte;beginResult := Byte(rgb);end;// виділення G-складовоїfunction GetGValue(rgb: DWORD): Byte;beginResult := Byte(rgb shr 8);end;// Виділення B-складовоїфункція GetBValue(rgb: DWORD): Byte;beginResult := Byte(rgb shr 16);end;
ResultRGB = RGB( RVALUE1 – round((RVALUE1 - RVALUE2) * Am/Amax),GVALUE1 – round((GVALUE1 - GVALUE2) * Am/Amax),BVALUE1 – round((BVALUE1 - BVALUE2) * Am/Amax) ); (1)
- Зміщення на мінус один (-1) піксель по вертикалі візуалізації для імітації руху водоспаду
- Нормування поточного значення N-ї гармоніки за максимальним значенням у тренді спектру
- Розрахунок кольору градієнтної заливки кожного пікселя, зіставленого своїй частоті та амплітуді за формулою 1
- Відображення лінії заввишки 1 піксель і шириною, що дорівнює кількості гармонік у спектрі в першому буфері FFTI
- Копіювання області першого буфера в другій з масштабуванням даної області, яка залежить від екранних координат і роздільної здатності екрана. Адже нам необхідно, щоб водоспад чітко збігався по ширині з екранним відмальовуванням того самого спектра, під яким він розташовується, а кількість точок у спектрі, а значить і ширина першого буфера (бітмапа) може бути різною. Відображення другого буфера на канві візуалізації водоспаду
- Прив'язка положення водоспаду до координат тренду спектру
- Задатися мінімальною Fmin та максимальною Fmax частотою сканування (перегляду), скажімо від 138 до 153 МГц
- Задати смугу пропускання приймального тракту, що визначається бітрейтом потоку через USB порт (для RTLSDR максимум polosa = 3.2 МГц)
- Поставити кількість точок перетворення метелика БПФ для однієї смуги, скажімо N = 4096, а по суті дискретність кроку частоти в одиночній смузі STEP = polosa / N
- Розрахувати кількість точок CNT, які помістяться у сумарній смузі = (різниці максимальної та мінімальної частот сканування) / ширину одиночної смуги пропускання * кількість точок перетворення N
- Ініціалізувати чіп
- Здійснити розрахунок точок центральної частоти кожної з смуг, що накопичуються. Особливістю завдання частоти при одиночному скануванні є те, що задається центральна частота, а відліки йдуть у діапазоні частот рівним ± половини смуги пропускання від центральної частоти. Таким чином, для реалізації панорамного режиму потрібно в нескінченному циклі - перебирати точки центральної частоти всіх смуг, отримувати вибірки кожної з одиночних смуг і накопичувати їх доти, доки не будуть перебрані всі смуги. Кількість смуг є округлення по п.4 без множення на кількість точок в одиночній смузі N. Зрозуміло, що перша центральна частота буде зі зсувом половини пропускання від мінімальної частоти сканування Fmin, а всі наступні будуть йти зі зсувом цілу смугу пропускання
Fo = round (Fmin + ((polosa/2) * cnt))