2009-08-05 12 views
8

Tôi đang cố gắng chuyển đổi hình ảnh thành tín hiệu âm thanh trong MATLAB bằng cách xử lý nó như một quang phổ as in Aphex Twin's song on Windowlicker. Rất tiếc, tôi gặp sự cố khi nhận kết quả.Kính hiển vi đảo ngược A La Aphex Twin trong MATLAB

Ở đây nó những gì tôi có vào lúc này:

function signal = imagetosignal(path, format) 

    % Read in the image and make it symmetric. 
    image = imread(path, format); 
    image = [image; flipud(image)]; 
    [row, column] = size(image); 
    signal = []; 

    % Take the ifft of each column of pixels and piece together the real-valued results. 
    for i = 1 : column 

     spectrogramWindow = image(:, i); 
     R = abs(ifft(spectrogramWindow)); 
     % Take only the results for the positive frequencies. 
     signalWindow = R(1 : row/2.0); 
     signal = [signal; signalWindow]; 

    end 

end 

Vì vậy, tôi đang tham gia Inverse Fourier Transforms trên các cột của hình ảnh của tôi và sau đó đặt chúng lại với nhau để tạo thành một tín hiệu. Ngoài ra, chức năng này sử dụng Hộp công cụ xử lý hình ảnh cho MATLAB để đọc trong hình ảnh. Mục tiêu là có một số biến thể của

spectrogram(imagetosignal('image', 'bmp')); 

dẫn đến kết quả giống như hình ảnh gốc. Tôi rất cảm kích mọi sự giúp đỡ! Tôi chỉ đang học xử lý tín hiệu, vì vậy đừng ngạc nhiên nếu có một quan niệm sai lầm rõ ràng. Cảm ơn!


Chỉnh sửa: Cảm ơn Dave! Tôi hiểu rồi! Tôi đã kết thúc với điều này:

function signal = imagetosignal(path, format) 

    % Read in the image and make it symmetric. 
    image = imread(path, format); 
    image = [image; flipud(image)]; 
    [row, column] = size(image); 
    signal = []; 

    % Take the ifft of each column of pixels and piece together the results. 
    for i = 1 : column 

     spectrogramWindow = image(:, i); 
     signalWindow = real(ifft(spectrogramWindow)); 
     signal = [signal; signalWindow]; 

    end 

end 

alt textalt text

+0

Vì vậy, chính xác thì sự cố bạn đang gặp phải là gì? – gnovice

+0

Trên đường trở lại, nửa trên của hình ảnh bị thiếu hiệu quả, và những gì vẫn còn smears trở lên khủng khiếp. –

+0

Vui vì nó hoạt động. Vui lòng chọn câu trả lời của tôi;) –

Trả lời

6

Có một số quan niệm sai lầm nhỏ ở đây.

tôi sẽ đi qua các vấn đề theo thứ tự xảy ra, chứ không phải mức độ nghiêm trọng:

1) Off-by-một lỗi trong tính toán của spectrogramWindow (hình ảnh)

Mục mảng đầu tiên nên được thành phần 0Hz, tiếp theo là N Hz. Phần tử cuối cùng của mảng phải là thành phần của -N Hz. Tuy nhiên, bạn đã tính 0Hz.

Tôi không chắc chắn cú pháp MATLAB, nhưng nếu bạn lật hình ảnh như bạn có, và sau đó tách các dòng trên cùng và dưới cùng trước khi thêm nó vào bản gốc, bạn nên được thiết lập.

Ngoài ra, bạn có thể xem xét KHÔNG gắn thêm hình ảnh vào chính nó, và sau khi trích xuất spectrogramWindow từ hình ảnh, áp dụng một số chức năng để làm cho nó đối xứng Hermitian.

2) Lấy abs của IFT. Không cần. Đừng làm thế.

Những gì bạn nhận được từ iFFT, nếu iFFT nhận được đầu vào phù hợp, là hoàn toàn có thật.

Bạn thấy giá trị phức tạp vì đầu vào không thực sự đối xứng Hermitian, như được mô tả ở trên. Không bao giờ sử dụng Abs(). Nếu bạn phải ăn gian, hãy giải nén phần Real, phần này sẽ không gấp rác trong thành phần ảo.

3) Bạn đang ném đi phần thứ hai của tín hiệu.

Khi bạn nhận được kết quả từ iFFT, biểu thị tín hiệu bạn đã yêu cầu. Đừng nghĩ về nó về tần số, nó bây giờ là một chuỗi thời gian âm thanh. Giữ nguyên toàn bộ.

Đây là cách tôi nhìn thấy nó đi:

spectrogramWindow = image(:, i); 
spectrogramWindow = [spectrogramWindow;reverse(spectrogramWindow(skip first and last))] 
signalWindow = ifft(spectrogramWindow); 
signal = [signal; signalWindow]; 
1

Chỉ cần nghiên cứu điều chính xác cùng và tìm thấy kịch bản perl này.Nghĩ rằng bạn có thể thích liên kết.

http://devrand.org/show_item.html?item=64&page=Project

+1

Liên kết không còn hoạt động nữa. Tuy nhiên, nó có sẵn trên Lưu trữ Internet: http://web.archive.org/web/20120224061437/http://devrand.org/view/imageSpectrogram – wizzwizz4