Có một thuật ngữ kỹ thuật cho phương pháp đơn giản này để làm mịn tín hiệu?


26

Đầu tiên, tôi chưa quen với DSP và không có giáo dục thực sự về nó, nhưng tôi đang phát triển một chương trình trực quan hóa âm thanh và tôi đại diện cho một mảng FFT là các thanh dọc như trong một hình ảnh phổ tần số điển hình.

Vấn đề tôi gặp phải là các giá trị tín hiệu âm thanh thay đổi quá nhanh để tạo ra đầu ra hình ảnh dễ chịu nếu tôi chỉ ánh xạ trực tiếp các giá trị FFT:

nhập mô tả hình ảnh ở đây

Vì vậy, tôi áp dụng một hàm đơn giản cho các giá trị để "làm mịn" kết quả:

// pseudo-code
delta = fftValue - smoothedFftValue;
smoothedFftValue += delta * 0.2; 
// 0.2 is arbitrary - the lower the number, the more "smoothing"

Nói cách khác, tôi đang lấy giá trị hiện tại và so sánh nó với giá trị cuối cùng, và sau đó thêm một phần của delta đó vào giá trị cuối cùng. Kết quả trông như thế này:

nhập mô tả hình ảnh ở đây

Vì vậy, câu hỏi của tôi là:

  1. Đây có phải là một mẫu hoặc chức năng được thiết lập tốt mà một thuật ngữ đã tồn tại không? Là như vậy, thuật ngữ là gì? Tôi sử dụng "làm mịn" ở trên nhưng tôi biết rằng điều này có nghĩa là một cái gì đó rất cụ thể trong DSP và có thể không chính xác. Ngoài ra, nó dường như có thể liên quan đến một phong bì âm lượng, nhưng cũng không hoàn toàn giống như vậy.

  2. Có cách tiếp cận tốt hơn hoặc nghiên cứu thêm về các giải pháp cho điều này mà tôi nên xem xét?

Cảm ơn thời gian và lời xin lỗi của bạn nếu đây là một câu hỏi ngu ngốc (đọc các cuộc thảo luận khác ở đây, tôi biết rằng kiến ​​thức của tôi thấp hơn nhiều so với mức trung bình có vẻ như).


1
Bây giờ tôi đang tự hỏi những gì bạn nhận được nếu bạn lấy FFT được làm mịn và nghịch đảo FFT nó.
dùng253751

Sẽ đơn giản hơn nếu chỉ trả lời đầu tiên theo một thứ tự khác? current_value = current_value * phân rã; if (new_value> current_value) {current_value = new_value; }
Richard Forster

@immibis Đây phải là một hồi âm từ sự hiểu biết của tôi. Đúng tôi, nếu tôi sai.
Andreas

Chắc chắn, và một trình biên dịch tối ưu hóa sẽ tạo ra việc thực hiện tương tự. Điểm mấu chốt là có được kết quả chính xác khi (current_value * phân rã) <new_value <current_value.
Richard Forster

2
Tôi thực sự thích câu hỏi này. Đó là một trong những nơi mà ai đó đang thử một vài thứ vô tình phát hiện ra mình ở dưới cùng của một cây kiến ​​thức khổng lồ (cụ thể là các bộ lọc Phản hồi xung vô hạn). Trong khi đó, những người đã trèo lên cây có thể mô tả tất cả những điều thú vị mà họ đã khám phá được giữa các nhánh ...
DrMcCleod

Câu trả lời:


37

Những gì bạn đã triển khai là bộ lọc thông thấp một cực, đôi khi được gọi là bộ tích hợp rò rỉ . Tín hiệu của bạn có phương trình sai khác:

y[n]=0.8y[n1]+0.2x[n]

x[n]y[n]


4
Cảm ơn rất nhiều vì chuyện này. Vì vậy, rất hữu ích. Tự mình googling giống như bị lạc trên biển khi nói đến công cụ DSP. Chỉ cần có một vài thuật ngữ để tìm kiếm cho tôi một cái gì đó để nắm bắt.
Michael Bromley

3
Tôi tự hỏi. Tôi nghĩ rằng OP áp dụng bộ lọc này trên chuỗi các giá trị trong các thùng riêng lẻ trong miền tần số. Một thông thấp thông thường được áp dụng trên một loạt các mẫu trong miền thời gian. Hiệu ứng có giống nhau không (tôi không nghĩ vậy, vì các phần tần số cao vẫn còn trong tín hiệu, nhưng cường độ của chúng thay đổi chậm hơn?)? Nếu không, bạn có thể giải thích những gì bộ lọc thực sự làm với tín hiệu trong miền thời gian không?
Jonas Schäfer

3
@JonasWielicki Tôi nghĩ rằng aim đang làm mịn từng giá trị bin riêng lẻ, do đó nó không thay đổi rất nhanh. còn bộ lọc thông thấp (như được giải thích trong câu trả lời) có thể áp dụng cho bất kỳ chuỗi thời gian nào không phân biệt miền của nó (thời gian hoặc tần suất hoặc bất cứ điều gì khác).
Arpit Jain

@arpitjain Tôi hiểu điều đó. Tôi chỉ đơn giản muốn biết liệu có bất kỳ sự hiểu biết nào (không nhất thiết là do bạn, OP hoặc người trả lời) làm thế nào nó ảnh hưởng đến miền thời gian khi bạn làm điều đó.
Jonas Schäfer

@JonasWielicki Hoạt động là một tích chập trong miền tần số, do đó, nó chuyển thành phép nhân (của biến đổi Fourier (nghịch đảo) tương ứng) trong miền thời gian.
MBaz

17

Cảnh báo: bao gồm một số lịch sử, giấy tờ cũ (tôi yêu chúng) và thẻ đục lỗ!

a=0.2

y(n)=y(n1)+a[x(n)y(n1)],
y(n)=ax(n)+(1a)y(n1).

Phiên bản đầu tiên ở trên ít tự nhiên hơn, nhưng nó tránh được một nhân, và bằng cách nào đó hiệu quả hơn. Cả hai công thức mang lại một bộ lọc đáp ứng xung tuyến tính , nguyên nhânvô hạn . Câu chuyện quay trở lại và thông qua Poisson, Kolmogorov-Zurbenko Bộ lọc thích ứng , Brown (Dự báo thống kê để kiểm soát hàng tồn kho. McGraw-Hill, 1959), Holt (1957) và Winters (1960). Nó được thực hiện như một sơ đồ lọc đệ quy được biết dưới các tên khác nhau trong tài liệu:

h[n]=(1a)u[n]an

Đối với một ghi chú lịch sử, Robert G. Brown và Arthur D. Little đã sử dụng phương pháp này vào năm 1956 trong việc làm mịn theo cấp số nhân để dự đoán nhu cầu , rõ ràng là cho ngành công nghiệp thuốc lá. Một chút lịch sử hơn và giải thích có thể được tìm thấy trong Holt-Winters Dự báo cho Dummies (hoặc phát triển) - Phần I . Peter Zehna đưa ra một đánh giá quan trọng trong một số nhận xét về làm mịn theo cấp số nhân , năm 1966. Một chương của R. Brown trong Bách khoa toàn thư về nghiên cứu và quản lý khoa học (sách Google) có từ lịch sử từ năm 1944, các trang có thể đọc được được sao chép ở đây:

Làm mịn theo cấp số nhân, p.  205, Bách khoa toàn thư về nghiên cứu và quản lý khoa học

Làm mịn theo cấp số nhân, p.  206, Bách khoa toàn thư về nghiên cứu và quản lý khoa học

Nhiều phương pháp mở rộng sự làm mịn này, điều này thiếu tính hợp lệ khi dữ liệu có xu hướng hoặc tính thời vụ. Một số trong số đó được gọi là làm mịn theo cấp số nhân gấp đôi hoặc gấp ba và bộ lọc Holt-Winters .

Bạn cũng có thể kiểm tra: Bộ lọc đơn giản này làm việc như thế nào?


1
Cảm ơn, điều này là tuyệt vời. Như đã đề cập, tôi hoàn toàn mới với điều này vì vậy một số câu trả lời của bạn sẽ cần nghiên cứu thêm để tôi đánh giá đầy đủ, nhưng nó chắc chắn trả lời câu hỏi của tôi và sau đó là một số. Nếu không được cho người khác, câu trả lời trước đó, điều này cũng là tất nhiên xứng đáng với sự chấp nhận như những câu trả lời.
Michael Bromley

1
Tôi điều chỉnh nhỏ, Winters 1 (960) nên là Winters (1960) Tôi giả sử
SGR

9

Có cách tiếp cận tốt hơn hoặc nghiên cứu thêm về các giải pháp cho điều này mà tôi nên xem xét?

Cách tiếp cận thông thường cho máy đo âm thanh là "máy dò đỉnh mất mát".

if new_value > current_value
  current_value = new_value;
else
 current_value = current_value * decay;  

Điều này phản ứng ngay lập tức với bất kỳ tín hiệu mới hoặc cực đại hoặc nhất thời trong tín hiệu nhưng nó tồn tại trong một thời gian để nó tạo ra một bức tranh ít bận rộn hơn nhiều. Phân rã phải là hằng số trong khoảng từ 0 đến 1. Nó kiểm soát tốc độ của các thanh được thực hiện với 0 là tức thời và 1 không bao giờ.


Tôi lưu ý rằng điều này mang những điểm tương đồng với bài tập tôi đã làm ở trường đại học, một âm thanh MIDI rất nhỏ (được tạo ra trong một bài tập trước) đã được cải thiện bằng cách kết hợp (và chia tỷ lệ để khớp với các đỉnh và thời lượng) các tín hiệu ghi chú (hoàn toàn hình chữ nhật) với hình tam giác tín hiệu lan man rất mạnh (mặc dù không phải ngay lập tức), và sau đó phân rã dần dần, để tạo ra một nốt nhạc sắc nét chết đi tự nhiên. Sự cải thiện rất lớn trong âm thanh của bài hát (Fur Elise trong trường hợp này).
KRyan

Tôi đoán bạn muốn giữ new_valuenếu nó lớn hơncurrent_value * decay
user276648

6

Xung quanh các nhà thầu DoD của Hoa Kỳ, bộ lọc cụ thể này thường được gọi là "bộ lọc alpha", bởi vì nó có thể được đặc trưng với một tham số có tên truyền thống là "alpha".

Nó tương tự trực tiếp với bộ lọc thông thấp RC tương tự simpe.

Chúng cực kỳ đơn giản, có những hạn chế nghiêm trọng, nhưng chúng có lợi thế không thể phủ nhận so với các bộ lọc phức tạp hơn (và phức tạp!) Mà nếu bạn tránh xa các vấn đề của chúng, chúng sẽ hoàn thành công việc.


3

Như đã đề cập trong các câu trả lời khác, đây là bộ lọc đệ quy đơn cực, một loại bộ lọc đáp ứng xung vô hạn (IIR).

Một nguồn tài nguyên tuyệt vời cho thông tin về điều này và các tính năng DSP khác là Hướng dẫn của nhà khoa học và kỹ sư về xử lý tín hiệu số của Steven W. Smith : đáp ứng xung vô hạn (IIR)

... Mỗi điểm trong tín hiệu đầu ra được tìm thấy bằng cách nhân các giá trị từ tín hiệu đầu vào với các hệ số "a", nhân các giá trị được tính toán trước đó từ tín hiệu đầu ra với các hệ số "b" và thêm các sản phẩm lại với nhau .. Lưu ý không có giá trị cho b0, vì giá trị này tương ứng với mẫu được tính. Phương trình 19-1 được gọi là phương trình đệ quy và các bộ lọc sử dụng nó được gọi là bộ lọc đệ quy. Các giá trị "a" và "b" xác định bộ lọc được gọi là các hệ số đệ quy.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.