Tôi đang hiển thị dạng sóng trong PHP bằng cách lấy mẫu xuống bằng bộ mã hóa lame và sau đó vẽ dạng sóng từ các điểm dữ liệu kết quả. Tôi hiện đang nhận được hình ảnh như thế này:Hiển thị dạng sóng trong PHP - Cách tạo ra kết xuất được nén nhiều hơn?
Những gì tôi muốn làm là thay đổi mã của tôi để các dải động rõ ràng của dạng sóng thực chất là 'nén'. Để tạo ra một dạng sóng trông giống như thế này:
Phương trình Tôi hiện đang sử dụng để làm cho chiều cao của mỗi điểm dữ liệu như sau: -
// draw this data point
// relative value based on height of image being generated
// data values can range between 0 and 255
$v = (int) ($data/255 * $height);
// don't print flat values on the canvas if not necessary
if (!($v/$height == 0.5 && !$draw_flat))
// draw the line on the image using the $v value and centering it vertically on the canvas
imageline(
$img,
// x1
(int) ($data_point/DETAIL),
// y1: height of the image minus $v as a percentage of the height for the wave amplitude
$height * $wav - $v,
// x2
(int) ($data_point/DETAIL),
// y2: same as y1, but from the bottom of the image
$height * $wav - ($height - $v),
imagecolorallocate($img, $r, $g, $b)
);
Với biên độ thực tế là được xác định bởi dòng đầu tiên của mã này: -
$v = (int) ($data/255 * $height);
Thật không may là kỹ năng toán học của tôi kém nhất. Những gì tôi cần làm về cơ bản là áp dụng 'đường cong' với giá trị $ v sao cho khi số đầu vào vào phương trình thấp hơn, kết quả đầu ra cao hơn và số đầu vào tăng phương trình làm giảm khuếch đại cho đến khi đầu vào đạt 255 đầu ra cũng phải là 255. Ngoài ra đường cong phải như vậy để với đầu vào của 0 đầu ra cũng là 0.
Tôi xin lỗi nếu điều này không rõ ràng nhưng tôi đang tìm câu hỏi này rất khó để khớp với kinh nghiệm toán học hạn chế của tôi.
Có lẽ một đại diện trực quan sẽ giúp mô tả ý định của tôi: -
Khi giá trị của $ v là 0 hoặc 255 đầu ra của phương trình nên được chính xác đầu vào (0 hoặc 255) . Tuy nhiên, khi đầu vào là một giá trị inbetween, nó phải theo kết quả đầu ra của đường cong ở trên. (Ở trên chỉ là một bản vẽ thô để minh họa.)
EDIT:
Dựa trên Alnitiks giải pháp 'pow' chức năng bây giờ tôi đang tạo ra dạng sóng trông như thế này: -
Sử dụng phương trình thay thế cho biến $ v như sau: -
$v = pow($data/255.0, 0.4) * $height;
Tôi đã thử tăng giá trị 0,4 nhưng kết quả là st bệnh không như dự định.
EDIT 2:
Theo yêu cầu ở đây là một datadump liệu của biến dữ liệu $ của tôi:
này được thông qua vào phương trình để trở $ v trước khi được sử dụng để vẽ dạng sóng (bạn có thể thấy những gì tôi làm với biến $ v trong mã ban đầu mà tôi đã đăng ở trên. $ height là đơn giản số pixel cao tôi đã đặt hình ảnh để hiển thị.
Dữ liệu này là danh sách giá trị được phân tách bằng dấu phẩy.Tôi hi vọng cái này giúp được. Nó xuất hiện khẳng định của bạn rằng giá trị trung bình là 128 là chính xác. Cho đến nay tôi đã không thể có được đầu của tôi xung quanh sửa chữa của bạn cho việc này. Tôi sợ nó hơi vượt quá sự hiểu biết hiện tại của tôi.
+1: Tôi không chắc chắn liệu đây có phải là chủ đề đúng hay không, nhưng tôi không quan tâm ... thật thú vị! –
Thực sự bạn cần tìm phương trình của đường cong đó và áp dụng hệ số nhân; đó là tất cả những điều này khi bạn giải phóng yếu tố thú vị. Và bạn có thể bỏ qua điều đó hoàn toàn và chỉ cần tạo thủ công một tra cứu các giá trị đã biết - như hakre gợi ý - nếu bạn không quan tâm đến các giá trị phân số (có vẻ như có khả năng). –
Thật vậy. Tôi tự hỏi liệu điều này có nên được đăng trên trang web toán hay không. Nhưng tôi chắc chắn những câu trả lời tôi sẽ nhận được từ các bạn sẽ có nhiều hơn trong ngôn ngữ của riêng tôi hơn là một nhà toán học. :-) – gordyr