Форум программистов, компьютерный форум, киберфорум
JavaScript
Войти
Регистрация
Восстановить пароль
Другие темы раздела
HTML, CSS Ширина с учетом margin https://www.cyberforum.ru/ html/ thread2751057.html
Добрый вечер, вопрос такого рода, как работает box-sizing понятно, но данная команда не включает в себя margin ни в каком виде. Существует ли какая то команда, которая рассчитывает ширину блока с...
HTML, CSS Border для видео
Имеется видео, нужно для него создать рамку, как на фото.
HTML, CSS Размеры блоков
Как выровнять блоки по средине до нормальных размеров. Сейчас они слишком сжаты <div class="data-cell" id = "data-cell"> <div class = "logo-cell"> <input value = "Play1" type="button"...
HTML, CSS Плавное изменение цвета в соответствии с RGB спектром в зависимости от времени перебывания В зависимости от времени пребывания на странице, реализовать плавное изменение цвета в соответствии с RGB спектром. В нулевой момент времени, цвет прямоугольника должен быть красным, через 30... https://www.cyberforum.ru/ html/ thread2750462.html
HTML, CSS Почему owl-carousel не выводит слайд по одиночке? https://www.cyberforum.ru/ html/ thread2750461.html
При ширине экрана до 999px owl-carousel выводит мне блоки в столбик, ая в настройках задал, чтобы отображалось по 3 item-а. В чем проблема? сайт http://norum1991.beget.tech/ код...
Codepen - как добиться чтобы просматривался длинный код? HTML, CSS
У меня создается главная страница сайта. Несколько секций с height:auto;. А как результат показывается только первая секция. Что нужно сделать что бы показывался весь код?
Codepen - Как добавить картинку в код html HTML, CSS
пишу в этом сервисе код с картинкой - и не отображается она как "результат." Есть ли какие-то особенности для добавления картинок в codepen?
HTML, CSS Как сделать так, чтобы гамбургер менял цвет при нахождении в разных секциях? Как сделать так, чтобы гамбургер менял цвет в зависимости от пролистывания секций? Сам гамбургер белого цвета, но лишь пару секций а сайте имеют яркий цвет и гамбургер белого цвета будет смотреться... https://www.cyberforum.ru/ html/ thread2750284.html
HTML, CSS Не работает clear https://www.cyberforum.ru/ html/ thread2750170.html
Добрый день! Такой вопрос, почему в данной ситуации не получается передвинуть текст с классом "test" вниз, что должна выполнить по сути команда clear. Никаких изменений не происходит при команде...
HTML, CSS Как сделать grid с разной шириной столбцов? Всем привет! Подскажите, как сделать такой grid. То что я криво нарисовал не обращайте внимания, главное расположение элементов. Лента длинная и это должно повторяться и дальше. Пока что я... https://www.cyberforum.ru/ html/ thread2750123.html
HTML, CSS Как сделать по данному примеру? https://www.cyberforum.ru/ html/ thread2750019.html
Хочу сделать по данному примеру , но не знаю как. Мне надо так во всех фото. Можете исправить код? Мой код: Css: .block2 { display: flex; flex-direction: column; background-color:white;...
HTML, CSS Почему появляется горизонтальный скролл? Не могу понять откуда у меня появляется горизонтальный скролл, что-то со второй секцией, но я не могу понять, что именно. сам сайт http://norum1991.beget.tech/ <!DOCTYPE html> <html lang="en">... https://www.cyberforum.ru/ html/ thread2749851.html
3 / 3 / 0
Регистрация: 29.06.2018
Сообщений: 1,137
30.12.2020, 19:26  [ТС] 0

Генератор звуковых частот.

30.12.2020, 19:26. Просмотров 1825. Ответов 14
Метки (Все метки)

Ответ


Убрал в аттаче лишние аудиоконтексты.

Добавлено через 8 минут
Защищать вход звуковой карты от перегрузки, предсказывая усиление, защищать вход исследуемого устройства от перегрузки. Правильное ослабление и усиление, а также уровень выхода еще зависят от Windows и драйверов.
Некоторые масштабные коэффициенты можно заменить на более правильные, регулировку чувствительности по входу сделать правильнее .

Добавлено через 35 секунд
Масштаб пока только для тенденции , а не для конкретных значений.

Добавлено через 1 час 33 минуты
Способ приделать регулировку отсчетов входного потока через gainNodeIn (может и неадекватно влиять на детектор при слабых сигналах, на всякий случай, лучше по результату ):

Javascript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
var gainNodeIn=null;
...
 
function  SetLevelIn()
{
LevelIn=document.getElementById("LevelInput").value;
document.getElementById("LevelIn1").innerHTML =LevelIn;
try {
gainNodeIn.gain.value =0.01*LevelIn ; //перенесено из множителя в формулах сюда. Можно иначе .
//Зависит от детектора сигнала , когда поток не открыт , не обрабатывается , при остановке удаляется 
} catch (e) { }
 
 
}
 
function CreateInputLevelMeter(stream)
{
 gainNodeIn = audioContext.createGain ? audioContext.createGain() : audioContext.createGainNode();
 gainNodeIn.gain.value=0;
 
    mediaStreamSource = audioContext.createMediaStreamSource(stream);
    meter = createAudioMeter(audioContext);
  //  mediaStreamSource.connect(meter); //without  Gain
 
    mediaStreamSource.connect(gainNodeIn); //connect input stream to  the input node
    gainNodeIn.connect(meter);//подключает выходной поток  к детектору сигнала
    gainNodeIn.gain.value =0.01*LevelIn ;
 
}
Добавлено через 26 минут
Javascript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
function createAudioMeter(audioContext, clipLevel, averaging, clipLag) 
{
 var processor = audioContext.createScriptProcessor(512); //512, 256, 1024, другое количество отсчетов в буфере (см. на НЧ)
 processor.onaudioprocess = volumeAudioProcess;
 processor.clipping = false;
 processor.lastClip = 0;
 processor.volume = 0;
 processor.clipLevel = clipLevel || 0.98;
 processor.averaging = averaging || 0.95;
 processor.clipLag = clipLag || 750;
 
 // this will have no effect, since we don't copy the input to the output,
 // but works around a current Chrome bug.
processor.connect(audioContext.destination);
 
processor.checkClipping =function()
{
if (!this.clipping) return false;
if ((this.lastClip + this.clipLag) < window.performance.now())  this.clipping = false;
return this.clipping;
};
 
processor.shutdown =function(){ this.disconnect(); this.onaudioprocess = null;  };
return processor;
}
 
function volumeAudioProcess( event ) {
 var buf = event.inputBuffer.getChannelData(0);
 var bufLength = buf.length;
// var sum = 0;
 var xmax= 0;
 var x;
    
 for (var i=0; i<bufLength; i++) {
 x = buf[i];
  if (Math.abs(x)>=this.clipLevel) { this.clipping = true; this.lastClip = window.performance.now();  }
  if (Math.abs(x)>=Math.abs(xmax)) { xmax=Math.abs(x); } 
 //sum += x * x;
 }
Регулятор входных отсчетов подойдет для испытания экспериментальных детекторов с особыми постоянными времени и необычным количеством отсчетов в буфере .
Детектор может быть и на пиковое значение а также на СКЗ только синусоидального сигнала (наш случай) на основе пикового для модуля отсчетов *0,707 .

С защитной задержкой меньше 1 с плохо детектирует на следующих точках или возможен моддинг постоянной времени и количества отсчетов .
У на K=Umout/Uminp= (1.41*UrmsOut)/(1.41*Urms_input), множители сокращаются , рассматриваем только модули коэффициента передачи для синусоидального воздействия.

Добавлено через 1 час 40 минут
Способ приделать переключатели ослабления (усиления, расставить знаки и множители, выбрать букву , A-ослабление,K-коэффициент передачи , как удобнее подписывать ):
HTML5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
   
<table>
 
<tr>
<td>
         <label for="FminIn"  >Fmin: </label>
         <input type="text"  name="FminIn"  id="FminIn" value="50"    >  Hz     
         <input type="button" value="Input Fmin" onclick="OnChangeFmin()" >  
</td>
<td>    
        <label for="Delay" >Delay:</label>
         <input type="text"  name="DelayIn" id="DelayIn" value="100"    > ms 
         <input type="button" value="Input Delay" onclick="OnChangeDelay()" >       
</td>
<td>
<label for="SelAosc">Aosc</label>
<select size="1"  name="SelAosc" id="SelAosc" onchange="SelectAosc()"  >
    <option disabled>Select Aosc</option>
    <option selected value="1"> 0 dB</option>
    <option  value="0.316">10 dB </option>
    <option value="0.1">20 dB</option>
    <option value="0.0316">30 dB</option>
    <option value="0.010">40 dB</option>
   </select>
</td>
<td>  <output id="LabelAosc"  >0</output>  </td>
</tr>  
<tr>
<td>        
         <label for="FmaxIn" >Fmax:</label>
         <input type="text"  name="FmaxIn"  id="FmaxIn" value="10000"    >  Hz
         <input type="button" value="Input Fmax" onclick="OnChangeFmax()" >   <br> 
</td> 
<td>
         <label for="Step" >FStep: </label>
         <input type="text"   name="StepIn"  id="StepIn" value="50"    >  Hz
         <input type="button" value="Input step" onclick="OnChangeStep()" >  <br>   
</td> 
</tr>
<tr>
<td> Fmin: <output id="minfreq"  >0</output> Hz  </td>
<td> Delay: <output id="delay1"  >0</output> ms </td>
 
<td>
<label for="SelKinp">Kinp</label>
<select size="1"  name="SelKinp" id="SelKinp" onchange="SelectKinp()"   >
    <option disabled>Select Kin </option>
       <option value="10">  +20 dB</option>
    <option value="3.16">  +10 dB</option>
    <option selected value="1"> 0 dB</option>
    <option  value="0.316">-10 dB </option>
    <option value="0.1">-20 dB</option>
    <option value="0.0316">-30 dB</option>
    <option value="0.010">-40 dB</option>
   </select>
</td>
<td>  <output id="LabelKinp"  >0</output></td>
 </tr>
 <tr> 
<td> Fmax:  <output id="maxfreq" >0</output> Hz </td>
<td> FStep: <output id="step1"  >0</output> Hz</td>
 
 
 
</tr>
</table>


Javascript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
 var Kin=1;
 var Aout=1;
 
function SelectAosc()
{
 Aout=parseFloat(document.getElementById("SelAosc").options[document.getElementById("SelAosc").selectedIndex].value );
document.getElementById("LabelAosc").innerHTML = Aout;
gainNodeOut.gain.value =0.01*LevelOut *Aout;
}
function SelectKinp()
{
Kin=parseFloat(document.getElementById("SelKinp").options[document.getElementById("SelKinp").selectedIndex].value );
document.getElementById("LabelKinp").innerHTML = Kin;
gainNodeIn.gain.value =0.01*LevelIn*Kin ;
}
 
function  SetLevelIn()
{
LevelIn=document.getElementById("LevelInput").value;
document.getElementById("LevelIn1").innerHTML =LevelIn;
try {
gainNodeIn.gain.value =0.01*LevelIn*Kin ;
} catch (e) { }
 
 
}
 
 
function  SetLevelOut()
{
LevelOut=document.getElementById("LevelOutput").value;
document.getElementById("LevelOut1").innerHTML =LevelOut;
try {
 gainNodeOut.gain.value =0.01*LevelOut *Aout;
} catch (e) { }
 
}
 
 
// и далее  добавить в формулы *=Kin, *=Aout
Добавлено через 1 час 17 минут
Как доработать скрипт-процессор для обнуления отсчетов перед защитным интервалом задержки для повышения правильности реакции на сигналы соответствующих точек по оси частот и защиты от помех , добавив точки обработки ? Предусмотрено ли это в BaseAudioContext.createScriptProcessor()?

Javascript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
function createAudioMeter(audioContext, clipLevel, averaging, clipLag   )   ?
{
 var processor = audioContext.createScriptProcessor(512); //512,fix
 processor.onaudioprocess = volumeAudioProcess;
 processor.clipping = false;
 processor.lastClip = 0;
 processor.volume = 0;
 processor.clipLevel = clipLevel || 0.98;
 processor.averaging = averaging || 0.95;
 processor.clipLag = clipLag || 750;
 
  processor.resetvolume= 0 ;   ? 
 
 // this will have no effect, since we don't copy the input to the output,
 // but works around a current Chrome bug.
processor.connect(audioContext.destination);
 
...
 
 
function volumeAudioProcess( event ) {
 var buf = event.inputBuffer.getChannelData(0);
 var bufLength = buf.length;
// var sum = 0;
 var xmax= 0;
 var x;
    
 for (var i=0; i<bufLength; i++) {
 x = buf[i];
  if (Math.abs(x)>=this.clipLevel) { this.clipping = true; this.lastClip = window.performance.now();  }
  if (Math.abs(x)>=Math.abs(xmax)) { xmax=Math.abs(x); } 
 //sum += x * x;
 }
 
 
     //var rms =  Math.sqrt(sum / bufLength);
     //  this.volume =  Math.max(rms, this.volume*this.averaging);
//   xmax*=0.707 ;  //fix for peak 
   if(this.resetvolume==1)  { xmax= 0;  }
   this.volume = xmax; //get peak value or rms value for Um*sin(w*t)
}
Добавлено через 11 минут
кажется, так
Javascript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
function createAudioMeter(audioContext, clipLevel, averaging, clipLag ,   ResetVolume) 
{
 var processor = audioContext.createScriptProcessor(512); //512,fix
 processor.onaudioprocess = volumeAudioProcess;
 processor.clipping = false;
 processor.lastClip = 0;
 processor.volume = 0;
 processor.clipLevel = clipLevel || 0.98;
 processor.averaging = averaging || 0.95;
 processor.clipLag = clipLag || 750;
  processor.ResetVolume =ResetVolume;
 // this will have no effect, since we don't copy the input to the output,
 // but works around a current Chrome bug.
processor.connect(audioContext.destination);
 
processor.checkClipping =function()
{
if (!this.clipping) return false;
if ((this.lastClip + this.clipLag) < window.performance.now())  this.clipping = false;
return this.clipping;
};
 
processor.shutdown =function(){ this.disconnect(); this.onaudioprocess = null;  };
return processor;
}
 
function volumeAudioProcess( event ) {
 var buf = event.inputBuffer.getChannelData(0);
 var bufLength = buf.length;
// var sum = 0;
 var xmax= 0;
 var x;
    
 for (var i=0; i<bufLength; i++) {
 x = buf[i];
  if (Math.abs(x)>=this.clipLevel) { this.clipping = true; this.lastClip = window.performance.now();  }
  if (Math.abs(x)>=Math.abs(xmax)) { xmax=Math.abs(x); } 
 //sum += x * x;
 }
 
 
     //var rms =  Math.sqrt(sum / bufLength);
     //  this.volume =  Math.max(rms, this.volume*this.averaging);
//   xmax*=0.707 ;  //fix for peak 
  if(this.ResetVolume==1){ xmax=0;  }
   this.volume = xmax; //get peak value or rms value for Um*sin(w*t)
}
 
 
 
...
 
 
function GetLevel(){    meter.ResetVolume=0;       guard_delay();      return (meter.volume ) ; }
...
function UpdateFreqValue()
{    meter.ResetVolume=1; 
document.getElementById("curfreq1").innerHTML =currfreq.toFixed(2);  
//oscillator.frequency.value=currfreq; 
 oscillator.frequency.setValueAtTime(currfreq, audioContext.currentTime); 
// oscillator.frequency.linearRampToValueAtTime(currfreq, audioContext.currentTime);
}


Вернуться к обсуждению:
Генератор звуковых частот.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
30.12.2020, 19:26
Готовые ответы и решения:

3D-аудиовизуализация. (Преобразование звуковых частот в графику)
Как реализовать дискретное преобразование вейвлет для аудиофайла? Какие вейвлет функции...

Меняю значение высоких и низких звуковых частот
Здравствуйте! Работаю над одним генератором звуковых частот, вернее над генератором шума. Нашёл...

Генератор звуковых волн
Есть статья, описывающая, как сделать генератор синуса, прямоугольного импульса, пилы и шума:...

Генератор звуковых сигналов
Всем доброго времени суток. Дали мне задание: сделать на ардуино генератор звуковых сигналов. Что...

14
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.