Generare onda sinusoidale tra il 10 e 20000Hz utilizzando Soundpool
-
25-09-2019 - |
Domanda
Ho cercato di generare una sinusoide utilizzando AudioTrack inizialmente. Il risultato non è stato soddisfacente. Poi mi sono trasferito alla classe Soundpool. Ho usato Audacity per creare audiofiles di 1 secondo e poi modificato la velocità di riproduzione (0,5-2,0) per ottenere le frequenze desiderate. (Array, come ci sono anche sega e wavefiles triangolo)
sig10000[0]=soundPool01.load(context,R.raw.sine10000,1);
sig2500[0]=soundPool01.load(context,R.raw.sine2500,1);
sig625[0]=soundPool01.load(context,R.raw.sine625,1);
sig157[0]=soundPool01.load(context,R.raw.sine156,1);
sig40[0]=soundPool01.load(context,R.raw.sine40,1);
Ho poi, a seconda della frequenza scelta, riprodurre l'audio:
public void play(){
Signal s=null;
float factor;
for(int i=0;i<this.size();i++){
s=this.get(i);
if(s.getFreq()>4999){
factor = s.getFreq()/10000f;
s.setStreamID(soundPool01.play(sig10000[s.getWaveType()],.99f,.99f,0,-1,factor));
}else if(s.getFreq()>1249){
factor = s.getFreq()/2500f;
s.setStreamID(soundPool01.play(sig2500[s.getWaveType()],.99f,.99f,0,-1,factor));
}else if(s.getFreq()>312){
factor = s.getFreq()/625f;
s.setStreamID(soundPool01.play(sig625[s.getWaveType()],.99f,.99f,0,-1,factor));
}else if(s.getFreq()>77){
factor = s.getFreq()/156f;
s.setStreamID(soundPool01.play(sig157[s.getWaveType()],.99f,.99f,0,-1,factor));
}else {
factor = s.getFreq()/40f;
s.setStreamID(soundPool01.play(sig40[s.getWaveType()],.99f,.99f,0,-1,factor));
}
}
}
Ora come la vedo io, il metodo funziona bene, tranne per la gamma 5000-20000 Hz. Sto rompendo la testa su questo, non so perché non il suo lavoro e non riesco a trovare nessuna modelli al problema.
C'è qualche problema di fondo con questo metodo?
Ringraziando in anticipo
Modifica: "non funzionava spiegato" Quando gioco onde sinusoidali nella gamma 5000-20000 Hz è molto evidente che la frequenza è imprecisa. Questo significa che il passo è lontano. Per esempio. 19000 Hz è troppo bassa e facilmente rilevabile ad orecchio. Quello che posso dire è che 10000 Hz (come fa 5000Hz- mio errore), velocità di riproduzione in modo normale, è corretto. A circa 14 kHz l'intonazione del segnale non è più corretta.
Pensieri / Possibili cause (?): (A) Quanti passi ci sono per il playbackspeed (Soundpool)? La documentazione dice 0,5-2,0 E 'possibile che questo significa che ci si trova a 15 diversi playbackspeeds? (B) Ho usato Audacity per generare i file .ogg. Quando ho ingrandire il seno 10000Hz posso vedere che non è troppo liscia (frequenza di campionamento 44100) e l'onda non si avvia in modo preciso e fine a 0. Could segnali questa sovrapposizione indesiderati?
Soluzione
La mia prima risposta è la fisica, non è la programmazione.
Ci sono poche possibilità che il dispositivo di prova avrà un altoparlante che è fisicamente in grado di produrre pulito uscita 19 Khz, come che è praticamente senza senso. Di conseguenza, esso produrrà altri, frequenze indesiderate se si tenta di guidare con un segnale 19 kHz campionato a 44 Khz.