綁定帳號登入

Android 台灣中文網

Android 台灣中文網 標籤 聲音 相關日誌

tag 標籤: 聲音

相關日誌

分享 為聽力受損者開發的視覺化聲音裝置 以提高車站安全性
balala 2022-11-16 21:03
富士通公司開發一款以AI來識別並顯示列車聲音的裝置,除了顯示手語的訊息也可以將工作人員廣播以文字呈現。
46 次閱讀|0 個評論
分享 固定頻率聲音輸出
jianrupan 2020-10-21 17:34
驗證程序 sineWave.SetRate(440, 3); // db 自動轉為負值 sineWave.SetVolume((float)0.5); // 注意波形變形 sineWave.Start(); sineWave.Play(); // 固定聲音頻率輸出 public class SineWaveGenerator { // 採樣頻率 private int RATE = 44100; private final int LEFT = 1; private final int RIGHT = 2; private final int DOUBLE = 3; // 輸出頻率 private int Hz; // 輸出分貝 private int dB = 0; // 輸出音量 private float volume; AudioTrack audioTrack; // 輸出聲道 private int channel; // 資料長度 private int length; // 一個正弦波長度 private int waveLen; // 正弦波資料陣列 private byte ; } // 音量設定 public void SetVolume(float v) { volume = v; } // 頻率分貝設定 public void SetRate(int hz, int db) { this.Hz = hz; this.dB = db; updateDB(db); } // 啟動播放 public void Start() { start(DOUBLE); } // 啟動播放 // @param channel 左, 右, 立體 private void start(int channel) { Stop(); if (Hz 0) { waveLen = (RATE/Hz)*2; // 實測 頻率 為 Hz/2(440Hz=440/2) length = waveLen * Hz; audioTrack = new AudioTrack( AudioManager.STREAM_MUSIC, // streamType RATE, // sampleRateInHz AudioFormat.CHANNEL_OUT_STEREO, // channelConfig AudioFormat.ENCODING_PCM_8BIT, // audioFormat length, // bufferSizeInBytes AudioTrack.MODE_STREAM // mode ); // 聲道音量 switch (channel) { case LEFT: audioTrack.setStereoVolume(volume, 0f); break; case RIGHT: audioTrack.setStereoVolume(0f, volume); break; case DOUBLE: audioTrack.setStereoVolume(volume, volume); break; } // 生成正弦波 wave = sineWave(waveLen, length); if (audioTrack != null) { audioTrack.play(); } } else { return; } } private boolean isRun = false; private boolean isStop = true; // 開始播放(寫入數據) public void Play() { isRun = true; isStop = false; if (audioTrack != null) { new Thread(new Runnable() { @Override public void run() { while(isRun) audioTrack.write(wave, 0, length); isStop = true; } }).start(); } } // 停止播放 public void Stop() { isRun = false; try { int limitCnt = 0; while(!isStop) { limitCnt++; if(limitCnt 1000) break; Thread.sleep(1); } } catch (InterruptedException e) { e.printStackTrace(); } isStop = true; if (audioTrack != null) { audioTrack.stop(); audioTrack.release(); audioTrack = null; } } // 取得播放狀態 public boolean GetRunStatus() { return isRun; } // 正弦波的高度 private final int ampMax = 127; // 8Bit編碼, 振幅最大 127 private int HEIGHT = ampMax; // 2PI private final double TWOPI = 2*Math.PI; // 生成正弦波 // @param waveLen 每段正弦波的長度 // @param length 總長度 // @return private byte bWave = new byte ; for(int i=0; ilength; i++) bWave = (byte)(HEIGHT*(1-Math.sin(TWOPI*((i%waveLen)*1.00/waveLen)))); return bWave; } // 更新聲音的分貝 // @param dB public void updateDB(double dB) { // db 自動轉為負值 if(dB 0) dB = 0-dB; // 10 的 **次方 HEIGHT = (int)(ampMax*Math.pow(10.0, dB/10)); } }
個人分類: 軟體應用|258 次閱讀|0 個評論