О. Чел съм, че техника номер 1 изисква много процесор и не е наистина осъществима. Това важи ли за ARM процесори като този на iPad?
Това прави един прост проблем сложен (игра на думи). Accelerate.framework предоставя оптимизирани варианти на тези функции (fwiw), но все още усложнява прост проблем. Като обща бележка: изчисленията с плаваща запетая на устройствата са бавни. Внедряването с плаваща запетая може да компрометира значително вашата програма. Това вероятно ще доведе до значително компрометиране на характеристиките, полифонията или качеството. Без да знаете изискванията, е трудно да се каже дали бихте могли да минете с изчисления с плаваща запетая.
Б. Каквато и техника да избера в крайна сметка, може ли проблемът с псевдонимите да бъде разрешен просто чрез свързване на нискочестотен филтър към изхода на осцилатора?
Това няма да работи за сигнали, генерирани във времевия домейн, освен ако не превишите семплирането.
В. Всяко друго предложение за това как да се приложи такъв осцилатор?
виж отдолу
Г. Някакви предложения кой C++ инструментариум да използвам? Гледах STK от CCRMA, но не знам дали има други по-подходящи библиотеки.
STK е по-скоро инструмент за обучение, отколкото инструментариум, предназначен за вградени синтезатори. Съществуват по-подходящи реализации.
Вариант 1. Измислете функция, която заема позицията на копчето и изчислява спектъра на действителния сигнал (масив от амплитуди и честоти) и след това използвайте куп синусоидални функции и блок за сумиране, за да реализирате изходния сигнал.
Вариант 2. Подобен на 1. но приложете обратно преобразуване на Фурие вместо синусите и сбора (ОК, на този етап не съм сигурен дали всъщност са едно и също нещо.)
Това е относително бавно на настолни компютри.
Вариант 4. Започнете с 2 зъбни вълни (те съдържат както четни, така и нечетни хармоници), обърнете едната и ги сумирайте и контролирайте амплитудата на всяка една от тях с копчето. Вълновите форми нямаше да бъдат
Можете да направите това доста ефективно (напр. с BLIT) за генериране без псевдоним. Въпреки това, BLIT е ограничен до шепа вълнови форми (можете да го използвате за Saw и Square). Можете да погледнете назад в историята и да попитате Как са решили този проблем в хардуерните и софтуерните синтезатори, прибл. 2000. Това беше едно от решенията. Друг беше:
Опция 3. Генериране на таблица с вълнови форми за всяка възможна позиция на копчето и използване на техника за синтез на вълнова таблица за генериране на изходния сигнал.
Имайки предвид възможностите на устройството, бих препоръчал int реализация на това или BLIT.
Масата е лесна за обработка и внедряване и осигурява добър звук и резултати на процесора. Освен това е много конфигурируем за компромиси CPU/Memory/Quality.
Ако искате свободен псевдоним (или близък), изберете BLIT (или роднина на). Причината е, че ще ви е необходима добра част от паметта и добро количество свръхсемплиране за минимално или никакво звуково псевдоним с вълнови таблици.
Изпълнение:
Има множество BLIT (и фамилни) реализации онлайн.
Ето една салфетка за драскане на маси:
enum { WF_Sine, WF_Saw, WF_Square, WF_COUNT };
enum { TableSize = SomePowerOfTwo };
struct sc_waveform {
uint32_t at[TableSize];
};
enum { NPitches = Something };
sc_waveform oscs[WF_COUNT][NPitches];
При инициализация използвайте адитивен синтез, за да попълните oscs
.
По време на възпроизвеждане използвайте едно от следните:
- интерполация и свръхсемплиране за четене от таблиците
- или добро количество свръхсемплиране на сигнала и след това понижаване (което е ефективно за процесора).
За справка: бих преценил, че линейната интерполация на таблица, която е изразходвала безотговорно количество памет (като се има предвид наличното количество) без свръхсемплиране, трябва да поддържа вашите честоти на псевдонима на или под -40 dB, ако не звуково овлажняване на най-високите части и сте изобразили на 44,1kHz. Това е наивен подход на груба сила! Можете да се справите по-добре с малко допълнителна работа.
И накрая, трябва също да намерите подходяща информация, ако потърсите в Google Vector Synthesis -- това, което описвате, е негова примитивна форма.
person
justin
schedule
27.01.2012