2015-03-13 42 views
-2

我試圖做一個簡單的過濾器傳入數據(保存最大和最小的選擇),例如:44100來每秒採樣,但屏幕必須顯示1000.我在44.1個採樣範圍內選擇最大值或最小值,然後輸出屏幕。但是,這個算法不是很準確。在代碼中,它看起來像這樣:示波器算法,動態數據輸入,限制輸出數據

例如僞算法

float max = 0; 
float min = 0; 
float filter = 0; 
float step = 44100/1000; 
for(int i = 0 ; i < 44100; i++){ 

    if(input[i] > 0) 
     if(max < input[i]) 
      max = input[i]; 
    if(input[i] < 0) 
     if(min > input[i]) 
      min = input[i]; 

    filter++; 
    if(filter >= step){ 
     filter = filter - step; 

     //1st version (bad version) 
     memory[count] = max + min; 

     //2nd version (bad version) 
     if(max > abs(min)) 
      memory[count] = max; 
     else if(max < abs(min)) 
      memory[count] = min; 

     //3nd version (only maximum) 
      memory[count] = max; //work great, but only > 0 

     //4nd version (only minimum) 
      memory[count] = min; //work great, but only < 0 

     max = 0; 
     min = 0; 
     count++; 
     if(count >= 1000) 
      count = 0; 
    }; 
}; 

我在做什麼錯?另外,一切工作正常(最大或最小),但當連接在一起,結果不好。

我有圖片,但是我無法在這裏粘貼它們。 該帖子下的圖片鏈接。

+0

您應該注意,整數除法44100/1000'實際上會產生44,而不是44.1。 – 2015-03-13 12:13:58

+0

你確定你初始化min&max爲0? – user3528438 2015-03-13 12:18:31

+0

這並不重要,傳入的數據可以是無限的,例如每10個樣本我們可以取1。保存最大值和最小值的任務,從... – gotostereo 2015-03-13 12:27:36

回答

0

要正確計算一組數字的最小/最大值,您必須正確初始化這些值。通過將它們設置爲0,您會遇到您找到的問題。你有兩種基本的方法來初始化min/max

  1. 它們設置爲更大的值/比任何輸入數據的更小。
  2. 將它們設置爲數組中的第一個值。

對於(1),如果你知道你的數據是,例如,總是在-100至+100之間,你可以簡單地做:

min = 101; 
max = -101; 

請注意,這不,如果你的輸入工作可以是該類型範圍內的任何值。對於(2)你可以這樣做:

float max = input[0]; 
float min = input[0]; 

... 

for (int i ...) 
{ 
    ... 

    if (filter >= step) 
    { 
     ... 
     min = input[i + 1]; // Be aware of overflow on the last element if 
     max = input[i + 1]; // input[] is exactly 44100 elements in size 
    } 
} 
+0

爲什麼初始化變量?軸信號0.值-1到1. – gotostereo 2015-03-13 13:09:36

+0

如果你知道你的輸入總是從-1到1,那麼你可以這樣做:'min = 2; max = -2;' – uesp 2015-03-13 13:26:25

+0

這不會改變結果。添加了3張圖片。它現在如何工作。在頂部帖子鏈接下。 – gotostereo 2015-03-13 13:41:03

0

你真的想看到什麼?如果是音頻採樣,則零表示安靜,您可能希望看到信封 - 將每個存儲箱(您的存儲箱= 1000個計數)的最小值和最大值一起存儲,並將兩者顯示在同一張圖片中。

你的採樣率(分割後的)是44赫茲,所以你可以忘記一些不錯的簡化波形(如果是音頻)...

+0

44 Hz是的,但圖形顯示不正確。 – gotostereo 2015-03-13 13:06:34

0

,你在第三圖看到的問題是,你正在存儲最小(約-1)或最大(約+1)的或者。而且這是非常隨機的你存儲的兩個中的哪一個。

當您連接點時,無論何時存儲兩個最小值或兩個最大值,都會看到一條短線段(2個像素)。但是如果你存儲了最小值和最大值,那麼連接這兩個值會得到一條非常陡峭的向上斜坡。最大值和最小值會給您一個強烈的下降斜率。

這裏真正的問題是,你可能沒有意識到你想繪製什麼。你應該有兩個陣列,memory_min[]memory_max[]。不要混合這兩個。

+0

是否可以通過這種方式實現信號過濾?信號是一個嗎?像其他人一樣實施? – gotostereo 2015-03-13 18:36:35

+0

我不知道你想要問什麼,對不起。 – MSalters 2015-03-14 15:33:28