سؤال

أحاول تحويل صورة إلى إشارة صوتية في MATLAB من خلال التعامل معها كمخطط طيفي كما في أغنية Aphex Twin لاعق النوافذ.لسوء الحظ، أواجه مشكلة في الحصول على نتيجة.

وهنا ما لدي في الوقت الراهن:

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

لذلك، أقوم بإجراء تحويلات فورييه العكسية على أعمدة من صورتي ثم أقوم بتجميعها معًا لتكوين إشارة.تستخدم هذه الوظيفة أيضًا مجموعة أدوات معالجة الصور لـ MATLAB لقراءتها في الصور.الهدف هو الحصول على بعض الاختلاف

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

يؤدي إلى شيء يشبه الصورة الأصلية.سأقدر كثيرا أي مساعدة!أنا أتعلم فقط معالجة الإشارات، لذا لا تتفاجأ إذا كان هناك مفهوم خاطئ واضح.شكرًا!


يحرر:شكرا ديف!لقد نجحت!انتهى بي الأمر بهذا:

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 text alt text

هل كانت مفيدة؟

المحلول

هناك بعض المفاهيم الخاطئة الصغيرة هنا.

سأستعرض المشاكل حسب ترتيب حدوثها، وليس شدتها:

1) خطأ متقطع في حساب نافذة الطيف (الصورة)

يجب أن يكون إدخال المصفوفة الأول مكونًا من 0 هرتز، والآخر هو N هرتز.يجب أن يكون العنصر الأخير في المصفوفة مكونًا من -N هرتز.ومع ذلك، لقد قمت بحساب 0 هرتز.

لست متأكدًا من بناء جملة matlab، ولكن إذا قمت بقلب الصورة كما فعلت، ثم قمت بإزالة السطور العلوية والسفلية قبل إلحاقها بالأصل، فيجب أن تكون جاهزًا.

بدلاً من ذلك، يمكنك التفكير في عدم إلحاق الصورة بنفسها، وبعد استخراج نافذة الطيف من الصورة، يمكنك تطبيق بعض الوظائف لجعلها متماثلة هرميتية.

2) أخذ عضلات البطن IFT.لا حاجة.لا تفعل ذلك.

ما تحصل عليه من iFFT، إذا حصل iFFT على المدخلات الصحيحة، هو حقيقي تمامًا.

أنت ترى قيمًا معقدة لأن الإدخال ليس متماثلًا هرميًا في الواقع، كما هو موضح أعلاه.لا تستخدم مطلقًا Abs().إذا كان عليك الغش، فاستخرج الجزء الحقيقي، الذي لن يتراكم في القمامة من المكون الوهمي.

3) أنت تتخلص من النصف الثاني من الإشارة.

بمجرد حصولك على الإخراج من iFFT، فإن ذلك يمثل الإشارة التي طلبتها.لا تفكر في الأمر من حيث الترددات، فهو الآن عبارة عن سلسلة زمنية صوتية.احتفظ بالأمر برمته.

وإليكم كيف أرى الأمر:

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

نصائح أخرى

ومجرد البحث في الشيء نفسه بالضبط، ووجدت هذه المخطوطة. أعتقد أنك قد ترغب في الارتباط.

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

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top