2009-07-19 38 views
8

Nếu tôi muốn giảm biên độ một tập tin WAV bằng 25%, tôi sẽ viết một cái gì đó như thế này:Làm cách nào để giảm bớt một tệp WAV bằng một giá trị decibel đã cho?

for (int i = 0; i < data.Length; i++) 
{ 
    data[i] *= 0.75; 
} 

Rất nhiều các bài báo tôi đọc về kỹ thuật âm thanh, tuy nhiên, thảo luận về biên độ về decibel. Tôi hiểu bản chất logarit của các đơn vị decibel về nguyên tắc, nhưng không quá nhiều về mặt mã thực tế.

Câu hỏi của tôi là: nếu tôi muốn giảm bớt âm lượng của tệp WAV, ví dụ, 20 decibel, tôi sẽ làm như thế nào trong mã như ví dụ trên?

Cập nhật: Công thức (dựa trên câu trả lời Nils Pipenbrinck của) cho tình tiết giảm nhẹ bởi một số lượng nhất định của decibel (nhập như một số dương ví dụ như 10, 20, vv):

public void AttenuateAudio(float[] data, int decibels) 
{ 
    float gain = (float)Math.Pow(10, (double)-decibels/20.0); 
    for (int i = 0; i < data.Length; i++) 
    { 
     data[i] *= gain; 
    } 
} 

Vì vậy, nếu tôi muốn để giảm bớt bởi decibel, hệ số tăng là .1.

+0

@sth: sao bạn dám chỉnh sửa câu hỏi của mình? Chỉ vì điều đó, tôi cho bạn một mớ phù hiệu và chữ "k" sau đại diện của bạn. – MusiGenesis

+2

':)' – sth

Trả lời

11

Tôi nghĩ bạn muốn chuyển đổi từ decibel thành gain.

Các phương trình cho âm thanh là:

decibel để đạt được:

gain = 10^(attenuation in db/20) 

hoặc trong C:

gain = powf(10, attenuation/20.0f); 

Các phương trình để chuyển đổi từ tăng để db là:

attenuation_in_db = 20 * log10 (gain) 
+0

Liệu anh ta muốn tăng điện áp hoặc tăng công suất cho chuyển đổi? Tôi không bao giờ có thể nhớ. – Nosredna

+2

Tôi nghĩ rằng nó đạt được điện áp. Nils có vẻ đúng. Nguồn: http://www.sengpielaudio.com/calculator-gainloss.htm – Nosredna

+0

Cảm ơn, Nils. Tôi luôn học tốt hơn từ một công thức tốt hơn bất cứ thứ gì khác. – MusiGenesis

1

Nếu bạn ju st muốn adust một số âm thanh, tôi đã có kết quả tốt với các gói normalize từ nongnu.org. Nếu bạn muốn nghiên cứu cách nó được thực hiện, mã nguồn là tự do có sẵn. Tôi cũng đã sử dụng wavnorm, trang chủ của họ có vẻ không hoạt động vào lúc này.

+0

Điều này thực sự cho một bộ tổng hợp phần mềm, để bình thường hóa ghi chú ở nốt khác nhau. Các gói bình thường trong liên kết của bạn chỉ sử dụng RMS, mà không thay đổi đáng kể như tôi thay đổi sân (Tôi không có ý tưởng những gì wavnorm không). Tôi đã tìm thấy rằng làm giảm khối lượng của một lưu ý bằng khoảng 5 decibel (sử dụng hàm từ Nils) trên một quãng tám trên một sân cơ sở dẫn đến một khối lượng cảm nhận liên tục trong phạm vi của một thang đo. – MusiGenesis

1

Một điều cần xem xét: tệp .WAV có nhiều định dạng khác nhau. Mã ở trên chỉ hoạt động với WAVE_FORMAT_FLOAT. Nếu bạn đang xử lý các tệp PCM, thì các mẫu của bạn sẽ là các số nguyên 8, 16, 24 hoặc 32 bit (8 bit PCM sử dụng số nguyên chưa được ký từ 0..255, PCM 24 bit có thể được đóng gói hoặc giải nén (đóng gói ==) Giá trị 3 byte được đóng gói cạnh nhau, được giải nén == 3 giá trị byte trong gói 4 byte)

Và sau đó có vấn đề về mã hóa thay thế - Ví dụ trong Win7, tất cả các cửa sổ âm thanh thực sự là tệp MP3 trong một Vùng chứa WAV

Rất tiếc, không đơn giản như âm thanh :(.

+0

Xin lỗi, "tệp WAV" chỉ là viết tắt cho dữ liệu âm thanh được lấy mẫu, một cách tổng quát. Tôi biết tất cả về các định dạng tệp WAV và MP3, mặc dù tôi phải nói rằng tôi chưa bao giờ gặp phải các tệp PCM 24 bit hoặc 32 bit trong tự nhiên. – MusiGenesis

+0

Tôi đang cố gắng đoán mục đích của tệp PCM WAV 24 bit đã giải nén sẽ là gì. Có nghĩa là để ghi lại đầu ra từ một máy trộn 24-bit, tôi đoán vậy? – MusiGenesis

+0

Tôi vừa đọc xong một đoạn tốt của blog của bạn. Là một lập trình viên âm thanh, tôi cúi đầu trước bạn. :) – MusiGenesis

1

Rất tiếc tôi hiểu lầm câu hỏi ... Bạn có thể thấy việc triển khai python của tôi chuyển đổi từ dB đến một phao (mà bạn có thể sử dụng như một số nhân vào biên độ như bạn thấy ở trên) và ngược lại

https://github.com/jiaaro/pydub/blob/master/pydub/utils.py

Tóm lại đó là:

10^(db_gain/10) 

như vậy để giảm âm lượng bằng 6 dB bạn sẽ nhân lên biên độ của mỗi mẫu bằng cách:

10^(-6/10) == 10^(-0.6) == 0.2512 
Các vấn đề liên quan