Python to Matlab Conversion for fscanf & DWT

Click For Summary
SUMMARY

This discussion addresses the conversion of MATLAB code utilizing the fscanf function and the Discrete Wavelet Transform (DWT) with order 2 ('db2') to Python. The original MATLAB code reads data from a file, applies the DWT, and plots the results. The proposed Python solution employs the pywt library for wavelet transformation, numpy for array manipulation, and matplotlib for plotting. Key issues include correctly reading the file and implementing the wavelet transform in Python.

PREREQUISITES
  • Familiarity with MATLAB syntax and functions, particularly fscanf and dwt
  • Understanding of Python programming, especially file handling and loops
  • Knowledge of the pywt library for wavelet transforms
  • Experience with matplotlib for data visualization
NEXT STEPS
  • Explore the pywt documentation for advanced wavelet functions
  • Learn about file reading techniques in Python, focusing on open and readline
  • Investigate the find_peaks_cwt function from scipy.signal for peak detection
  • Review tutorials on data visualization with matplotlib to enhance plotting skills
USEFUL FOR

Data scientists, engineers, and researchers transitioning from MATLAB to Python for signal processing and wavelet analysis will benefit from this discussion.

Simon_Azerty
Messages
1
Reaction score
0
Hello,
1. Homework Statement

I find diffuculties to transform fscanf and to apply the discrete wavelet transform order 2 from matla to python.

Homework Equations


This is the MATLAB code:
Matlab:
D_P=fopen('distance_profil.txt','r');
i=0;
while(feof(D_P)==0)% test for end of file
    i=i+1;
    sign=fscanf(D_P,'%f , ');
    classe=fgetl(D_P);
      %wavelet transform
       [caH(i,:),cdH(i,:)] = dwt(sign,'db2');     
% Segmentation 
   loc=[];
        [pks,locs] = findpeaks(abs(cdH(i,:)),'threshold',3);
        loc=[loc,locs];
        mod=abs(cdH(i,:));
   figure
   titre = ['distance profil : ' classe];
    
        subplot(2,1,1); plot(sign); title(titre);
        hold on, plot(2*locs,sign(2*locs),'dr')
        subplot(2,1,2); plot(abs(cdH(i,:))); title('Module  Details coef. for db2');
        hold on, plot(locs,mod(locs),'dr') 
end

The Attempt at a Solution



Python:
import pywt
import numpy as np
from scipy.signal import find_peaks_cwt
import matplotlib.pyplot as plt

D_P= open ("distance_profil.txt","r")
i=0
while True:
    line = D_P.readline().strip()
    if line == '':

        def ReadFile():
            sign = []
            with open('textfiledata.txt', 'rt') as myFile:
                for line in myFile:
                    sign.append(map(int, line.split(',')))
            return sign

        classe = D_P.readline().rstrip()
        cA= np.array(sign)
        cD= np.array(sign)
    
        i+=1

        array[cA(i,:), cD(i,:)] = pywt.dwt([sign, 'db2'])

        loc=[]
        [pks,locs] = find_peaks_cwt(abs(cdH(i,)),'threshold',3);
        loc=[loc,locs];
        mod=abs(cdH(i,:));
      
        plt.figure()
        plt.subplot(2,2,1)
        plt.plot(sign,2*locs,sign(2*locs),'ro')
        plt.title('distance profil : ' , classe);
      
        plt.subplot(2,2,2)
        plt.plot(abs(cdH(i,:)),locs,mod(locs),'ro')
        plt.title("Module des Details coef. for db2")
        plt.show()
        break
 
Last edited by a moderator:
Physics news on Phys.org
Fscanf simply reads in a float value and a comma and then the loop repeats the action

You could develop a similar function that reads a float at a time and when the line is exhausted read in a new line and when the file is exhausted exit the function with an error code.

Here's some that does something similar:

http://sciprogtips.blogspot.com/2010/01/fscanf-with-python.html
 

Similar threads

  • · Replies 2 ·
Replies
2
Views
2K
  • · Replies 3 ·
Replies
3
Views
3K
  • · Replies 3 ·
Replies
3
Views
4K
  • · Replies 1 ·
Replies
1
Views
1K
  • · Replies 4 ·
Replies
4
Views
2K