RaisedCosineWindower API及加窗





  1. <span style=“font-size:24px;”>本類的構造方法  
  2. public RaisedCosineWindower( );空構造方法  
  3. public RaisedCosineWindower( double alpha, float windowSizeInMs, float windowShiftInMs );非空構造方法,初始化了必要的相關屬性。  
  4. 本類方法:  
  5. public void newProperties(PropertySheet ps);用於改變屬性的值。  
  6. public void initialize();處理器初始化,new了一個空鏈接列表給outputQueue。  
  7. private void createWindow(int sampleRate);如果餘弦窗口存在,且採樣率與輸入採樣率相等則返回,否則,設置爲輸入採樣率,並創建餘弦窗口,得到窗口長度所含的採樣數,和窗口移動所包含的採樣數。對窗口中的每個點賦值爲cosineWindow[i] = (1-alpha)-alpha * Math.cos(2 * Math.PI * i / ((double) cosineWindow.length - 1.0));並設置了overflowBuffer = new DoubleBuffer(windowSize);與窗口的採樣數相同。  
  8. private static int getWindowCount(int arraySize, int windowSize,int windowShift);返回的是在給定數組,窗口長度,窗口移動的情況下,窗口的個數。分了兩種情況:  
  9. 1,  數組長度 arraySize小於窗口windowSize的情況,則窗口爲0個,即返回爲0.  
  10. 2,  數組長度 arraySize大於或等於窗口windowSize的情況;開始窗口個數設爲1;  
  11. 以窗口長度反覆加窗口移動值並與數組長度比較。  
  12. int windowCount = 1;  
  13.             for (int windowEnd = windowSize;  
  14.                  windowEnd + windowShift <= arraySize;  
  15.                  windowEnd += windowShift) {  
  16.                   windowCount++;  
  17.             }  
  18. public float getWindowShiftInMs();獲得窗口移動值。  
  19. public int getSampleRate();獲得採樣率  
  20. public long roundToFrames(long samples);  
  21. long mxNumShifts = samples / windowShift;  
  22.         for (int i = (int) mxNumShifts; ; i–) {  
  23.             long remainingSamples = samples - windowShift * i;  
  24.             if (remainingSamples > windowSize)  
  25.                 return windowShift * (i + 1) + windowSize;  
  26.         }  
  27. public Data getData();返回data對象。如果輸出存在數據就成輸出列表中輸出,沒有的話從前一個處理器中讀取數據進行窗口處理後,在存輸出列表中輸出。分爲兩種情況:  
  28. 1,  outputQueue.isEmpty()即輸出列表爲空的情況:處理步驟爲下:  
  29. 1,  獲得前一處理器的輸出的data數據  
  30. 2,  判斷data的對象類型:  
  31. 1,  爲doubledata時  
  32.            1,創建餘弦窗口  
  33.            2,對輸入數據DoubleData進行窗口處理  
  34. 2,  爲信號的情況下的處理,都需要把信號加入輸出列表中:  
  35.       A,爲DataStartSignal對象時,創建窗口,並往信號的props的map對象中窗口處理過程的,窗口的長度,窗口的移動值。  
  36.       B,DataEndSignal和SpeechEndSignal,都會對上次窗口處理未處理的殘留的採樣數進行處理。  
  37.        C,SpeechStartSignal時僅對currentFirstSampleNumber進行了設置,使其值爲-1.  
  38. private void process(DoubleData input);input爲上個處理器的輸出的doubledata數據。對input進行窗口處理,得到結果窗口緩存入於輸出列表outputQueue中。處理流程如下:   
  39. 1,  得到一個輸入的doubledata中所包含的採樣。存入一個double數組中。並把doubledata添加入創建的鏈接列表中。  
  40. 2,  得到double數組的長度加上上一次窗口處理殘留爲未進行處理的數據的長後並與餘弦窗口比較,  
  41. 1,  長度小於餘弦窗口長度的情況;繼續從前個處理器讀取data數據,直到所有的doubledata數據中所包含的採樣數之和大於或等於窗口長度爲止,如果在讀取的過程中碰到了dataendsignal信號,那會設置utteranceend標記,並退出循環。同時把所有的信號都添加入輸出列表中。並把所有的讀取到的doubledata中包含的採樣,都存入一個數組中。此數組將會被用於進行餘弦窗口處理,以得到窗口。  
  42. 3,  把所有的採樣(即所有從前一處理器讀到的doubledata中包含的)進行餘弦窗口處理。即窗口處理。  
  43. 4,  查看窗口處理中是否有未進行窗口處理的採樣數。如果有存入把未處理的採樣都存入overflowbuffer中即DoubleBuffer對象中,並在此對象中記錄位處理的採樣的個數即對occupancy賦值。  
  44. 5,  對從前一處理器讀取的數據含有dataendsignal的情況進行處理,如果在此情況下窗口處理後仍然有殘留未處理的,則需要對此殘留的的進行窗口處理。  
  45.   
  46.   
  47. private int applyRaisedCosineWindow(double[] in, int length);對in數組中的length個的元素進行升餘弦窗口處理。分三中情況考慮:  
  48. 1,  length小於餘弦窗口的長度時,進行填充處理。與餘弦窗口相乘一次,即窗口數爲1。  
  49. 2,  length等於餘弦窗口的長度。與餘弦窗口相乘一次,即窗口數爲1。  
  50. 3,  length大於餘弦窗口的長度。首先計算出窗口數,通過length-窗口長度後得到的值來整除窗口的移動值後的值在加1即爲窗口數,在與餘弦窗口相乘窗口數次,第一次相乘時取in中的0——窗口長度-1個數,之後取in中窗口移動值——窗口長度+窗口移動-1。注意每次相乘時在in數組取的數目要與窗口長度相同,每次從in取數時,從窗口移動的倍數開始即0*窗口移動,1*窗口移動…直到窗口數爲止。  
  51. myWindow[w] = in[s] * cosineWindow[w]  
  52. 處理完以上的情況,後根據每次相乘後得到的數組(窗口),新建一個doubledata對象,然後把每次doubledata添加入輸出列表中(outputqueue)。  
  53. 返回的是最後一次相乘時的in數組中取的窗口長度的數據的開始的位置加上窗口移動值後的值。  
  54. private void processUtteranceEnd();對在窗口處理中的讀取前一處理器的數據中包含dataendsignal信號的情況進行處理。</span>  
<span style="font-size:24px;">本類的構造方法
public RaisedCosineWindower( );空構造方法
public RaisedCosineWindower( double alpha, float windowSizeInMs, float windowShiftInMs );非空構造方法,初始化了必要的相關屬性。
本類方法:
public void newProperties(PropertySheet ps);用於改變屬性的值。
public void initialize();處理器初始化,new了一個空鏈接列表給outputQueue。
private void createWindow(int sampleRate);如果餘弦窗口存在,且採樣率與輸入採樣率相等則返回,否則,設置爲輸入採樣率,並創建餘弦窗口,得到窗口長度所含的採樣數,和窗口移動所包含的採樣數。對窗口中的每個點賦值爲cosineWindow[i] = (1-alpha)-alpha * Math.cos(2 * Math.PI * i / ((double) cosineWindow.length - 1.0));並設置了overflowBuffer = new DoubleBuffer(windowSize);與窗口的採樣數相同。
private static int getWindowCount(int arraySize, int windowSize,int windowShift);返回的是在給定數組,窗口長度,窗口移動的情況下,窗口的個數。分了兩種情況:
1,  數組長度 arraySize小於窗口windowSize的情況,則窗口爲0個,即返回爲0.
2,  數組長度 arraySize大於或等於窗口windowSize的情況;開始窗口個數設爲1;
以窗口長度反覆加窗口移動值並與數組長度比較。
int windowCount = 1;
            for (int windowEnd = windowSize;
                 windowEnd + windowShift <= arraySize;
                 windowEnd += windowShift) {
                  windowCount++;
            }
public float getWindowShiftInMs();獲得窗口移動值。
public int getSampleRate();獲得採樣率
public long roundToFrames(long samples);
long mxNumShifts = samples / windowShift;
        for (int i = (int) mxNumShifts; ; i--) {
            long remainingSamples = samples - windowShift * i;
            if (remainingSamples > windowSize)
                return windowShift * (i + 1) + windowSize;
        }
public Data getData();返回data對象。如果輸出存在數據就成輸出列表中輸出,沒有的話從前一個處理器中讀取數據進行窗口處理後,在存輸出列表中輸出。分爲兩種情況:
1,  outputQueue.isEmpty()即輸出列表爲空的情況:處理步驟爲下:
1,  獲得前一處理器的輸出的data數據
2,  判斷data的對象類型:
1,  爲doubledata時
           1,創建餘弦窗口
           2,對輸入數據DoubleData進行窗口處理
2,  爲信號的情況下的處理,都需要把信號加入輸出列表中:
      A,爲DataStartSignal對象時,創建窗口,並往信號的props的map對象中窗口處理過程的,窗口的長度,窗口的移動值。
      B,DataEndSignal和SpeechEndSignal,都會對上次窗口處理未處理的殘留的採樣數進行處理。
       C,SpeechStartSignal時僅對currentFirstSampleNumber進行了設置,使其值爲-1.
private void process(DoubleData input);input爲上個處理器的輸出的doubledata數據。對input進行窗口處理,得到結果窗口緩存入於輸出列表outputQueue中。處理流程如下: 
1,  得到一個輸入的doubledata中所包含的採樣。存入一個double數組中。並把doubledata添加入創建的鏈接列表中。
2,  得到double數組的長度加上上一次窗口處理殘留爲未進行處理的數據的長後並與餘弦窗口比較,
1,  長度小於餘弦窗口長度的情況;繼續從前個處理器讀取data數據,直到所有的doubledata數據中所包含的採樣數之和大於或等於窗口長度爲止,如果在讀取的過程中碰到了dataendsignal信號,那會設置utteranceend標記,並退出循環。同時把所有的信號都添加入輸出列表中。並把所有的讀取到的doubledata中包含的採樣,都存入一個數組中。此數組將會被用於進行餘弦窗口處理,以得到窗口。
3,  把所有的採樣(即所有從前一處理器讀到的doubledata中包含的)進行餘弦窗口處理。即窗口處理。
4,  查看窗口處理中是否有未進行窗口處理的採樣數。如果有存入把未處理的採樣都存入overflowbuffer中即DoubleBuffer對象中,並在此對象中記錄位處理的採樣的個數即對occupancy賦值。
5,  對從前一處理器讀取的數據含有dataendsignal的情況進行處理,如果在此情況下窗口處理後仍然有殘留未處理的,則需要對此殘留的的進行窗口處理。


private int applyRaisedCosineWindow(double[] in, int length);對in數組中的length個的元素進行升餘弦窗口處理。分三中情況考慮:
1,  length小於餘弦窗口的長度時,進行填充處理。與餘弦窗口相乘一次,即窗口數爲1。
2,  length等於餘弦窗口的長度。與餘弦窗口相乘一次,即窗口數爲1。
3,  length大於餘弦窗口的長度。首先計算出窗口數,通過length-窗口長度後得到的值來整除窗口的移動值後的值在加1即爲窗口數,在與餘弦窗口相乘窗口數次,第一次相乘時取in中的0——窗口長度-1個數,之後取in中窗口移動值——窗口長度+窗口移動-1。注意每次相乘時在in數組取的數目要與窗口長度相同,每次從in取數時,從窗口移動的倍數開始即0*窗口移動,1*窗口移動…直到窗口數爲止。
myWindow[w] = in[s] * cosineWindow[w]
處理完以上的情況,後根據每次相乘後得到的數組(窗口),新建一個doubledata對象,然後把每次doubledata添加入輸出列表中(outputqueue)。
返回的是最後一次相乘時的in數組中取的窗口長度的數據的開始的位置加上窗口移動值後的值。
private void processUtteranceEnd();對在窗口處理中的讀取前一處理器的數據中包含dataendsignal信號的情況進行處理。</span>


轉:http://blog.csdn.net/taiyb/article/details/46315869

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章