Как генерировать частотно-зависимую волну, зависящую от времени?

547
cdlvcdlv

Я хочу создать звук, частота которого зависит от времени, скажем, что частота timeмс равна timeГц, следовательно, через 20 с у вас есть все слышимые частоты. Например, с помощью ffmpeg вы можете использовать переменную времени (% T) для наложения времени каждого кадра на видео. Я думал, что смогу использовать переменную% T для генерации такой волны. я пробовал

ffmpeg -f lavfi -i "sine=frequency=%T*1000:sample_rate=44100:duration=20" -c:a pcm_s16le allfreq.wav 

но кажется, что sineфильтр должен иметь фиксированную частоту.

Я пытался использовать ffmpeg, но не имеет значения, какую программу вы используете, если она бесплатная (легкие загрузки приветствуются).

0
Вы можете наложить каждый кадр видео и просто внезапно переключиться на звук? Что касается функции [`sine`] (https://ffmpeg.org/ffmpeg-filters.html#sine), то вы фактически пытаетесь создать только часть синуса. В противном случае у вас будет увеличиваться базовая частота, а синус будет оставаться синусом. Может быть, вы могли бы использовать [Chirp Generator из Audacity] (http://manual.audacityteam.org/man/generate_menu.html). Seth 7 лет назад 2
Генератор ЛЧМ идеально подходит. У него есть больше вариантов, о которых я не думал, но тем не менее, это интересно. Вы можете написать это как ответ. cdlvcdlv 7 лет назад 0

2 ответа на вопрос

2
Seth

Пока вы начинаете говорить о видео, кажется, что вы действительно заинтересованы в аудио. Вы sineсчитаете, что функция верна, так как для нее требуется фиксированная частота, поскольку вы устанавливаете базовую частоту таким образом. Это все равно будет синус "вокруг" этой частоты.

То, что вы на самом деле пытаетесь сделать, это генерировать часть синуса или, что более вероятно, линейную функцию, постоянно увеличивающую частоту. Чтобы сделать это, вы можете попробовать использовать такую ​​программу, как Audacity и Chrip Generator, которая, как она звучит, будет именно тем, что вы ищете. Это позволило бы вам генерировать звук, начинающийся с частоты X, и позволить ему заканчиваться в Y после времени N.

Вы правы, мой оригинальный вопрос был написан несколько запутанно. Я отредактировал это, чтобы сделать это более ясным для будущих читателей. cdlvcdlv 7 лет назад 1
1
Gyan

Если вы используете ffmpeg, у вас есть фильтр aevalsrc:

ffmpeg -f lavfi -i "aevalsrc='sin(1000*t*2*PI*t)':s=44100:d=20" -c:a pcm_s32le allfreq.wav 

Вы должны быть в состоянии эмулировать все параметры генератора чирп, как только вы выясните необходимое выражение :)

Я использовал 32-разрядный формат с плавающей точкой в ​​качестве выходного формата, так как это рабочий формат Audacity.

Я не знал фильтра `aevalsrc`. Я полагаю, что `ffmpeg` может работать, но не с этими параметрами. Частота звука, генерируемого вашей командой, увеличивается до 11,025 с; затем начать уменьшаться. Я вижу связь между переменной `t` и частотой, но не так, как ожидалось. cdlvcdlv 7 лет назад 0
Да, я вижу это. Вероятно, из-за сочетания двух вещей: 1) низкая частота дискретизации 2) сглаживание выходной частоты фильтра, как только оно достигает четверти частоты дискретизации. Используйте `s = 176400`. Gyan 7 лет назад 1
Есть еще одна проблема: неверная формула внутри «греха». С `ffmpeg -f lavfi -i" aevalsrc = 'sin (1000 * t * PI * t)': s = 44100: d = 20 "-c: pcm_s16le allfreq.wav` волна верна. cdlvcdlv 7 лет назад 0
С этой формулой вы будете подниматься только до 10 кГц. Один цикл синусоидальной волны равен «2 * PI», поэтому «2 * PI * t» производит одну волну в секунду. `1000 * 2 * PI * t` производит 1000 в секунду. Вы также умножаете на t, чтобы варьировать перевозчика. Gyan 7 лет назад 1
Я понимаю вашу точку зрения, но и Audition, и Audacity показывают волну от `ffmpeg -f lavfi -i" aevalsrc = 'sin (1000 * t * 2 * PI * t)': s = 176400: d = 20 "-c: a pcm_s32le allfreq.wav` достигает 40 кГц в спектральном представлении. Может быть, ошибка _ffmpeg_? cdlvcdlv 7 лет назад 0
Возможно. Посмотрим на это завтра. Gyan 7 лет назад 0