Trong một số bài báo, tôi đọc rằng nhiễu phụ gia là dải trắng Gaussian giới hạn.
Làm cách nào tôi có thể mô phỏng loại tiếng ồn này bằng MATLAB?
Trong một số bài báo, tôi đọc rằng nhiễu phụ gia là dải trắng Gaussian giới hạn.
Làm cách nào tôi có thể mô phỏng loại tiếng ồn này bằng MATLAB?
Câu trả lời:
Bạn sẽ tạo ra nhiễu Gaussian được phân vùng bằng cách đầu tiên tạo ra nhiễu trắng, sau đó lọc nó theo băng thông mà bạn mong muốn. Ví dụ:
% design FIR filter to filter noise to half of Nyquist rate
b = fir1(64, 0.5);
% generate Gaussian (normally-distributed) white noise
n = randn(1e4, 1);
% apply to filter to yield bandlimited noise
nb = filter(b,1,n);
Chỉ là một bổ sung nhỏ cho câu trả lời của Jason: thông thường bạn cần tạo ra nhiễu có giới hạn băng tần với phương sai cho trước . Bạn có thể thêm mã này vào mã được đưa ra trong câu trả lời của Jason:
var = 3.0; % just an example
scale = sqrt(var)/std(nb);
nb = scale*nb; % nb has variance 'var'
Lưu ý rằng bạn phải thực hiện chia tỷ lệ sau khi lọc, vì nói chung bộ lọc thay đổi phương sai nhiễu.
Mỗi khi bạn tạo các mẫu tiếng ồn riêng biệt (Sử dụng MATLAB randn
/ rand
), bạn thực sự tạo ra tiếng ồn giới hạn băng tần.
Tất cả những gì bạn cần làm là điều chỉnh phương sai của các mẫu rời rạc thành phương sai của tiếng ồn "Liên tục" mà các mẫu được cho là lấy từ.
Cho một White Noise liên tục (Sense Wide) với phương sai và bạn muốn mẫu nó ở tốc độ bạn nên tạo mẫu tạp âm rời rạc với phương sai của .
Kết quả này là hợp lệ giả định trước khi lấy mẫu tiếng ồn liên tục mà bạn đã áp dụng bộ lọc LPF lý tưởng với băng thông .
Mô tả đầy đủ được đưa ra ở đây - Cách mô phỏng AWGN (Tiếng ồn Gaussian trắng phụ gia) trong các hệ thống truyền thông cho băng thông cụ thể .
Tại sao người ta không thể sử dụng cách tiếp cận được đề cập trong bài viết này ?
Nó bắt đầu với tần số mong muốn và hoạt động ngược để xây dựng tín hiệu, thay vì lọc. Nó sử dụng mã python, nhưng cũng liên kết đến mã Matlab gốc.
Có bất kỳ nhược điểm để làm điều đó theo cách đó?
Tôi nhận ra câu hỏi này xuất hiện trong chế độ xem hiện tại vì @Drazick đã sửa đổi câu trả lời năm 2013 của anh ấy / cô ấy.
nếu bạn tạo ra một số giả ngẫu nhiên đồng phục pdf tốt(nói sử dụng rand()
hoặc frand()
, nếu đó là phiên bản tốt) nằm trong khoảng từ 0 đến 1 (đó là), Sau đó nếu bạn làm điều đó 12 lần, cộng tất cả 12 của các giá trị được cho là độc lập và không tương quan, và trừ 6,0 từ tổng điều đó, bạn sẽ có cái gì đó là rất gần với một đơn vị sai và zero-mean số ngẫu nhiên gaussian. nếu các số giả ngẫu nhiên pdf thống nhất là "tốt" (nghĩa là chúng thể hiện tính độc lập với nhau), thì tổng này sẽ là "màu trắng" khi bạn có thể nhận được tín hiệu thời gian rời rạc.
"Tiếng ồn trắng" , tất nhiên là một cách gọi sai, ngay cả đối với các tín hiệu tương tự. một "tín hiệu năng lượng" với phổ phẳng cho đến vô tận cũng có sức mạnh vô hạn. tín hiệu hầu như gaussian và "trắng" được tạo ra như mô tả có công suất hữu hạn (là phương sai và là 1) và băng thông hữu hạn, được biểu thị dưới dạng một phía, là Nyquist. (vì vậy 'mật độ phổ công suất "hoặc công suất trên mỗi đơn vị tần số là 1 / Nyquist.) chia tỷ lệ và bù cho nó theo ý bạn.
Tôi cho rằng tôi có thể chỉnh sửa nó sau và thêm một số mã giả giống như C để hiển thị rõ ràng điều này.
Tạo ra tiếng ồn trắng toàn phổ và sau đó lọc nó giống như bạn muốn sơn tường màu trắng của ngôi nhà của bạn, vì vậy bạn quyết định sơn toàn bộ ngôi nhà màu trắng và sau đó sơn lại toàn bộ ngôi nhà trừ bức tường. Là ngu ngốc. (Nhưng có ý nghĩa trong điện tử).
Tôi đã tạo một chương trình C nhỏ có thể tạo ra nhiễu trắng ở bất kỳ tần số và bất kỳ băng thông nào (giả sử ở tần số trung tâm 16kHz và "rộng" 2 kHz). Không có lọc liên quan.
Những gì tôi đã làm rất đơn giản: bên trong vòng lặp chính (vô hạn) tôi tạo ra một hình sin ở tần số trung tâm +/- một số ngẫu nhiên giữa băng thông -half và + nửa băng thông, sau đó tôi giữ tần số đó cho một số lượng mẫu tùy ý (độ chi tiết) và điều này là kết quả:
Nhiễu trắng rộng 2kHz ở tần số trung tâm 16kHz
Mã giả:
while (true)
{
f = center frequency
r = random number between -half of bandwidth and + half of bandwidth
<secondary loop (for managing "granularity")>
for x = 0 to 8 (or 16 or 32....)
{
[generate sine Nth value at frequency f+r]
output = generated Nth value
}
}